首先看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); }