Android-Scroller详细学习

2017/6/6 posted in  Android

前言

Scroller是一个专门用于处理滚动效果的工具类,可能在大多数情况下,我们直接使用Scroller的场景并不多,但是很多大家所熟知的控件在内部都是使用Scroller来实现的,如ViewPager、ListView等。先撇开Scroller类不谈,其实任何一个控件都是可以滚动的,因为在View类当中有scrollTo()和scrollBy()这两个方法。这两个方法都是用于对View进行滚动的,那么它们之间有什么区别呢?简单点讲,scrollBy()方法是让View相对于当前的位置滚动某段距离,而scrollTo()方法则是让View相对于初始的位置滚动某段距离。注意,不管是scrollTo()还是scrollBy()方法,滚动的都是该View内部的内容

2017092315061662718986.jpg
2017092315061662718986.jpg

第一个参数x表示相对于当前位置横向移动的距离,正值向左移动,负值向右移动,单位是像素。第二个参数y表示相对于当前位置纵向移动的距离,正值向上移动,负值向下移动,单位是像素。

scrollBy()

scrollBy()方法则是让View相对于当前的位置滚动某段距离,那每当我们点击一次scrollBy按钮,View的当前位置都进行了变动,因此不停点击会一直向右下方移动。

scrollTo()

scrollTo()方法是让View相对于初始的位置滚动某段距离,由于View的初始位置是不变的,因此不管我们点击多少次scrollTo按钮滚动到的都将是同一个位置。

Scroller

目前使用这两个方法完成的滚动效果是跳跃式的,没有任何平滑滚动的效果。没错,只靠scrollTo()和scrollBy()这两个方法是很难完成ViewPager这样的效果的,因此我们还需要借助另外一个关键性的工具,也就我们今天的主角Scroller。
Scroller的基本用法其实还是比较简单的,主要可以分为以下几个步骤:

  • 创建Scroller的实例
  • 调用startScroll()方法来初始化滚动数据并刷新界面 
  • 重写computeScroll()方法,并在其内部完成平滑滚动的逻辑

startScroll(int startX,int startY,int dx,int dy)

  • 第一个参数是滚动开始时X的坐标
  • 第二个参数是滚动开始时Y的坐标
  • 第三个参数是横向滚动的距离,正值表示向左滚动
  • 第四个参数是纵向滚动的距离,正值表示向上滚动。
  • 紧接着调用invalidate()方法来刷新界面。

startScroll (int startX, int startY, int dx, int dy, int duration)

同上

  • 第五个参数是滑动时间

computeScroll()

在其内部完成平滑滚动的逻辑 。在整个后续的平滑滚动过程中,computeScroll()方法是会一直被调用的,因此我们需要不断调用Scroller的computeScrollOffset()方法来进行判断滚动操作是否已经完成了,如果还没完成的话,那就继续调用scrollTo()方法,并把Scroller的curX和curY坐标传入,然后刷新界面从而完成平滑滚动的操作。

@Override
public void computeScroll() {
    // 第三步,重写computeScroll()方法,并在其内部完成平滑滚动的逻辑
    if (mScroller.computeScrollOffset()) {
        scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
        invalidate();
    }
}

getScrollX() | getScrollY()

返回当前view在x或者y方向上的滚动距离