首先看View#scrollTo(int x,int y),以x为例。当传入的x>0View内容产生了滚动,并且沿着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就是上一个办法传入的参数xl-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);    }