首先看 View#scrollTo(int x,int y)
,以x
为例。当传入的 x>0
,View
内容产生了滚动,并且沿着 x
轴的负方向滚动。why???
scrollTo 滚动的是 View 的内容。如果想通过 scrollTo 使某个 view 产生滚动,该当调用其父 View 的 scrollTo 办法。
来看源码。
先看 View#scrollTo(int x,int y)
源码。x
间接被赋值给mScrollX
。
#View.java
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();
}
}
}
对于一个 View,当调用其父 view 的 scrollTo 办法使其从 A 点滚动到 B 点,再滚动到 C 点,此时 view 的 mScrollX 是其总 (A->C) 的滚动间隔,而不是阶段 (A->B 或者 B ->C) 滚动间隔
在看 View# invalidate(int l, int t, int r, int b)
。 这里的 scrollX 就是上一个办法传入的参数 x
。l-scrollX
是绘制区域的右边,r-scrollX
是绘制区域的左边。x>0
绘制区域就会左移;x<0
绘制区域就会右移。
#View.java
public void invalidate(int l, int t, int r, int b) {
final int scrollX = mScrollX;
final int scrollY = mScrollY;
invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);
}