Andrid_scrollTo/scrollBy方法的区别

我们都知道 View#scrollTo/scrollBy() 方法是用于 View 内容的滑动的。那么这两个方法有什么区别呢?

下面通过源码来总结这两个区别在哪里:

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();
        }
    }
}

public void scrollBy(int x, int y) {
    scrollTo(mScrollX + x, mScrollY + y);
}

上面是两个方法的源码,可以清楚地看到 scrollBy 实际是调用 scrollTo 方法。那么 scrollTo 做了什么事?

根据传入的 x 和 y 值,赋值给当前的 mScrollX 和 mScrollY 两个值,这两个值是什么意思呢?它们分别表示当前 View 内容需要滑动的绝对位置

下面举例分析:
假设当前 View 的位置是在(60,70)的位置上,如果调用 scrollTo(-50,-50),那么当前 View 的内容直接滑动到(50,50)的位置上,结果 View 内容的位置为 (50,50)。

scrollBy 内部就是在当前 View 内容的位置的基础上再滑动 x 和 y 像素的距离,假设当前 View 内容的位置为(60,70),然后调用 scrollBy(-50,-50) 之后,View 内容会在水平向右滑动50px,竖直向下滑动 50px,结果 View 内容的位置为(110,120)。

Andrid_scrollTo/scrollBy方法的区别_第1张图片

结论: scrollTo 方法是实现 View 内容的绝对滑动,而 scrollBy 是实现 View 内容的相对滑动。

在上面有一点需要注意的是,我一直在强调 View 内容的滑动,而不是 View 的滑动,因为 scroll 就是实现的是 View 内容的滑动,View 本身的位置和顶点坐标并不会发生改变,这是需要注意的一点;

当 View 的内容的左边缘在 View 的左边缘的左边时,那么 scollX > 0,否则则相反;

当 View 的内容的顶部边缘在 View 的顶部边缘上边时,那么 scolY > 0,否则则相反;

Andrid_scrollTo/scrollBy方法的区别_第2张图片

你可能感兴趣的:(Android)