scrollTo()和scrollBy()
首先介绍一下scrollTo()和scrollBy()这两个方法:
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();
}
}
}
scrollTo()是让当前的View能够平移到所给定的位置
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
而scrollBy()方法的实现是根据scrollTo()而完成的,唯一的区别在于scrollBy()是根据当前已经位移的坐标为基础再继续进行位移。也就是说scrollTo()实现的是输入参数的绝对滑动,而scrollBy()实现的是输入参数的相对滑动。
理解scrollTo()和scrollBy()
这里是个人的理解,可能跟网上说的不一样。可以根据自己情况自己斟酌。
好理解的地方
不管是scrollTo()还是scrollBy()移动的都不是View本身而是View的内容 。
如果View是一个ViewGroup 就是移动他的所有子Views
如果是一个View比如图片或者文字移动的就是内容部分而View本身是不动的。
这个不多解释,随便写个小Demo 测试下就能看懂。
不好理解的地方
不好理解的地方?
当我调用 View.scrollTo(100,100); 我会发现View 的内容实际是像左上角移动了。
好像跟预期的有一点点出入?
这里说一下本人的理解
既然一个View 有滑动功能,一般情况下就是View 的大小 不能展示 View 的内容才提供了滑动功能,通过滑动View 可以查看一些没有展示出来的内容,比如图片特别大我们可以查看图片的局部 。就是这个道理。这个地方的滑动不是移动View。所以这个就是这两个方法的本质,他的设计本身就不是为了移动View而设计的,而是为了滑动显示View 没有展示出来的内容。
这里我们知道了View的滑动是为了显示View没有显示的内容,那么说明View 本身不够大,而内容是比View大的,大家可以简单想象一下就像我们做的大图浏览功能,每次只是看到局部的内容,然后滑动查看其它位置打的内容。
那么我们查看内容的时候,从左上角 往右下角滑动的过程,是不是就是我们平时的基本操作?对!就是这个过程。 View.scrollTo(100,100); 移动的意思就是 从左上角往右下角 查看这个移动。但是呢因为 View.scrollTo(100,100); 这个方法是移动他的内容,而View 本身是不动的。所以就相当于变成了内容 从右下角往左上角移动了,这个就是这两个方法不好理解的地方。
误会点
而我们最大的误会点就是把 View.scrollTo(); 理解为了View 的移动。而当View 不动,View 内容的移动,刚好跟View 的移动方向是相反的。所以就让人不好理解 为什么 明明我想写的是向左下角移动,而内容却向右上角了 。就是这个地方的误会