乐趣区

关于android:androidViewscrollTo滚动方向

首先看 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);
    }
退出移动版