Android中的ScrollTo和ScrollBy解析
关于Android中的ScrollBy和ScrollTo方法相信大家并不陌生,这两个方法是在View中实现的。所以在各个继承了View的类都可以使用改方法。
在View中对这两个方法的源码编写是这样的,有兴趣的朋友可以研究一下:
/**
/**
* Set the scrolled position of your view. This will cause a call to
* {@link #onScrollChanged(int, int, int, int)} and the view will be
* invalidated.
* @param x the x position to scroll to
* @param y the y position to scroll to
*/
public void scrollTo(int x, int y) {
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
invalidateParentCaches();
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
}
/**
* Move the scrolled position of your view. This will cause a call to
* {@link #onScrollChanged(int, int, int, int)} and the view will be
* invalidated.
* @param x the amount of pixels to scroll by horizontally
* @param y the amount of pixels to scroll by vertically
*/
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
首先我们来看看To方法,它有一个这样的判断
if (mScrollX != x || mScrollY != y)
这是什么意思呢,这里出现了mScrollX和mScrollY两个数值,做动画的朋友肯定对这两个参数不会陌生。 mScrollX是原点(也就是左上角)到指定View的左上角的X轴距离,mScrollY亦然。
这时这个判断的意义就明确了,就是用于判断移动量是否是View当前原点,如果不是,则开始下面的代码
接下来就是交换保存值,刷新视图,开始调用onScrollChanged方法移动View位置。
而by方法其实就是在调用To方法,这时也就能看出,To单次移动的,而By可以反复的按照自己所给的值移动
在这里特别说一下,我们都知道在Android中,坐标原点是在左上角,往右代表x,往下代表Y ,在eclipse中,在填这两个参数时若要往下xy移动20,写法是ScrollBy(-20,-20);
而在Android studio中写法则是ScrollBy(-+20,-+20);来代表放下分别移动20点,如果直接填写20,会编译不通过。修改成-+20则不会出问题,不知道是否是我一个人有这个问题。
接下来测试一下这两个方法。
在布局文件中放入两个Button,一个是用于By另一个是To,代码如下
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.xh.admin.myscrolltest.MainActivity"> <Button
android:id="@+id/scrollBy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="By"
/> <Button
android:id="@+id/srcollTo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/scrollBy"
android:text="To"
/> </RelativeLayout> 而在MainActivity中简单的几行代码代码量很小,直接写到一个方法里。
package com.xh.admin.myscrolltest; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout; import static com.xh.admin.myscrolltest.R.id.scrollBy; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final RelativeLayout re = (RelativeLayout) findViewById(R.id.activity_main);
Button by = (Button) findViewById(scrollBy);
Button To = (Button) findViewById(R.id.srcollTo); by.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
re.scrollBy(-+20, -+20); }
}); To.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
re.scrollTo(-+20,-+20);
}
});
}
} 至于为什么Scroll方法中的值是负数,而不是正数,这有一篇文章写的很好:http://www.tuicool.com/articles/uM7ruy
,在运行这个小的Test代码时会发现一个问题,无论点击那个按钮,另一个按钮也会一起移动,就算是添加与Scroll方法无关的控件,也一样会移动,千万不要以为这是因为相对布局原因,线性布局中也是一样的,
这是因为,ScrollBy和 To 的行为是,哪个View调用的它,哪个View的内容就开始整个移动,如果是Button调用的其中某个方法,那么Button的位置不会变,但是Button中的内容会移动,现在我们希望Button移动
那马我们就指定Button的父容器来调用这两个方法。 如果想要在某个界面中只希望一部分内容移动,可以嵌套布局方法,指定某一个ViewGroup移动。 最近在slidingmenu和ViewPager中常接触到这两个方法,特此记录,写的很差,大牛勿喷
Android中的ScrollTo和ScrollBy解析的更多相关文章
- Android中的三种XML解析方式
在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.下面就对三种解析 ...
- Android逆向之旅---Android中锁屏密码算法解析以及破解方案
一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机 ...
- Android中微信抢红包插件原理解析和开发实现
一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...
- android中使用哪种方式解析XML比較好
SAX是一个用于处理XML事件驱动的"推"模型. 长处是一种解析速度快而且占用内存少的xml解析器,它须要哪些数据再载入和解析哪些内容. 缺点是它不会记录标签的关系.而要让你的应用 ...
- android中init.rc文件的解析问题
init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值 ...
- android中回调函数机制完全解析
1.在要调用的业务操作中,创建一个接口,在接口中创建方法,这个方法表示的是我们原先要在业务类中执行的操作 public interface BackUpSmsListener { /** * 设置总进 ...
- Android中解析XML
XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...
- 1.Android中解析json程序代码
Android程序解析json数据可以通过gson的方式,这种情况需要导入相应的jar包.测试代码如下: @Override protected void onCreate(Bundle savedI ...
- Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别
XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...
随机推荐
- java精度计算代码,指定精确小数位
java代码: public class App2 { public static void main(String[] args) { String val = checkNumber(" ...
- .Net Core 之 MSBuild 介绍
前言 关于 .NET Core 旧版本的 sdk 介绍可以参看我以前的 这篇 文章. 8 个小时前,.NET Core 项目组释放了 .NET Core 新一轮的 sdk 工具更新,即 RC4 版本 ...
- 使用JAVA开发微信公众平台(一)——环境搭建与开发接入
一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...
- 一个想法(续五):IT联盟创业计划:现阶段进度公示、疑问解答及进行中的计划
前言: 首先今天是元宵节,先祝大伙元宵节快,单纯的快乐! 然后看看开展中的计划: IT联盟创业计划众筹发起:一个想法(续三):一份IT技术联盟创业计划书,开启众筹创业征程 IT联盟创业计划众筹进度:一 ...
- swift 可选类型笔记
晚上十一点半了,看书累了,原本想睡了的,想了想,还是把刚看的总结一下,把这篇笔记写了吧.广州下雨,真特么的冷..好了,废话不说了,说正题说说Swift可选类型. 先定义一个变量: var string ...
- C#类详解
类: 类是一种数据结构,它可以包含数据成员(常数和字段).函数成员(方法.属性.事件.索引器.运算符实例.构造函数静态构造函数和析构函数),以及嵌套类型.类类型支持继承,继承是一种机制,它使派生类可以 ...
- Smarty3配置及入门语法
一.Smarty3配置 下载Smarty文件 在Smarty的官方网站下载Smarty文件,解压下载到的Smarty文件,Smarty的库文件就在libs文件夹中. 我使用的PHP调试环境的程序集成包 ...
- Omi实战-QQ附近用户列表Web页
原文地址https://github.com/AlloyTeam/omi/blob/master/docs/cn_pr_nearby.md 写在前面 Omi很适合大型复杂的Web页面开发,例如一些We ...
- 利用Eclipse的JPA自动生成注解实体
新公司用的SSH(springmvc)框架,看代码的时候,发现没有hbm.xml文件,全部使用的注解形式.在一次闲聊的时候问同事,这么多entity 写起来不麻烦么.同事说根据数据库自动生成的.于是 ...
- angular : ng-animate : css 原理,详解
通过几中指令就能完成1.2.xx的animate ·ng-repeat ·ng-show,ng-hide ·ng-if,ng-include,ng-view ·ng-switch ·ng-class ...