Android ScrollTo和ScrollBy

参考文档1
参考文档2

当我们编写一些自定义的滑动控件时,会用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY()。由于常常会对函数getScrollX(), getScrollY()返回的值的含义产生混淆,尤其是正负关系,因此本文将使用几幅图来对这些函数进行讲解以方便大家记忆。

注意:调用View的scrollTo()和scrollBy()是用于滑动View中的内容,而不是把某个View的位置进行改变。如果想改变莫个View在屏幕中的位置,可以使用如下的方法。

    调用public void offsetLeftAndRight(int offset)用于左右移动方法或public void [offsetTopAndBottom]     
    (http://developer.android.com/reference/android/view/View.html#offsetTopAndBottom(int))(int offset)用于上下移动。

     如:button.offsetLeftAndRignt(300)表示将button控件向左移动300个像素。

在注释中说到,该方法用于设置滚动视图的位置,然后会调用onScrollChanged(int, int, int, int)方法,最后视图会被刷新。那它是如何让视图滚动的呢?首先注意到在这个方法中有两个变量:mScrollX、mScrollY。

这两个变量分别是视图在水平和垂直方向的偏移量,

 mScrollX:  该视图内容相当于视图起始坐标的偏移量, X轴方向
 mScrollY: 该视图内容相当于视图起始坐标的偏移量, Y轴方向

分别通过getScrollX() 和getScrollY()方法获得。

scrollTo()

说明:在当前视图内容偏移至(x , y)坐标处,即显示(可视)区域位于(x , y)坐标处。

/**
 * Set the scrolled position of your view. This will cause a call to
 * {@link #onScrollChanged(int, int, int, int)} and the view will be
 * invalidated.
 * @param x the x position to scroll to
 * @param y the y position to scroll to
 */
    public void scrollTo(int x, int y) {
        //偏移位置发生了改变
        if (mScrollX != x || mScrollY != y) {
              int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;  //赋新值,保存当前便宜量
            mScrollY = y;
            //回调onScrollChanged方法
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
            if (!awakenScrollBars()) {
                invalidate();  //一般都引起重绘
            }
        }
    }

sctollBy

public voidscrollBy(int x, int y)
说明:在当前视图内容继续偏移(x , y)个单位,显示(可视)区域也跟着偏移(x,y)个单位。

    /**
       * Move the scrolled position of your view. This will cause a call to
       * {@link #onScrollChanged(int, int, int, int)} and the view will be
       * invalidated.
       * @param x the amount of pixels to scroll by horizontally
       * @param y the amount of pixels to scroll by vertically
       */
      // 看出原因了吧 。。 mScrollX 与 mScrollY 代表我们当前偏移的位置 , 在当前位置继续偏移(x ,y)个单位
      public void scrollBy(int x, int y) {
          scrollTo(mScrollX + x, mScrollY + y);
      }

总结:scrollTo()指的是移动到制定的(x,y)位置,而scrollBy(x,y)指的是,在当前位置在移动(x,y)个位置

你可能感兴趣的:(Android ScrollTo和ScrollBy)