Android自定义View - Scroller

247 阅读2分钟

Scroller其实很简单,顾名思义,就是用于计算滑动位置的。在ViewPager中,也用到Scroller。你想想看,ViewPager这么复杂的滑动,都用它,你是不是可以用它很方便的做比较复杂的滑动效果。

Scroller的使用流程

首先,你需要创建一个Scroller。在哪里创建呢?对了,除了构造方法外,有个非常巧妙的位置,那就是onFinishInflate,这个方法在一个view和它所有的子控件被完全解析出来后调用,也就是通常所说的xml布局解析完成。

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    mScroller = new Scroller(getContext(), this);
}

@Override
public float getInterpolation(float input) {
    return input;
}

然后有个很重要的方法,computeScroll,这里是固定写法,你就这么写就行了,Scroller帮你保存滑动的坐标位置,在滑动变量改变的时候,你只需要在里面拿当前的x和y坐标就可以了。

@Override
public void computeScroll() {
    super.computeScroll();
    if (mScroller.computeScrollOffset()) {
        scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
        invalidate();
    }
}

最后在你要触发滑动的地方,调用startScroll()方法,startX和startY是起始位置,dx和dy是滑动的偏移量,duration为完成滑动的时长,duration可以不传,默认就是250ms。最后调用invalidate()方法,触发刷新。

mScroller.startScroll(startX, startY, dx, dy, duration);
invalidate();

可能会用到的相关知识

了解一些ViewConfiguration手机系统相关视图的配置是非常有用的。

// 获取当前手机系统被称之为移动的最小距离
ViewConfiguration.get(getContext()).getScaledTouchSlop();
// 获取当前手机系统用力拖拽的最小速度
ViewConfiguration.get(getContext()).getScaledMinimumFlingVelocity();
// 获取当前手机系统用力拖拽的最大速度
ViewConfiguration.get(getContext()).getScaledMaximumFlingVelocity();

通常使用VelocityTracker来跟踪手指的速度。

mTracker = VelocityTracker.obtain();
mTracker.addMovement(motionEvent);
// 第一个参数为unit,推荐1000,一般也为1000,它会让你得出的结果以1000为基准,如果你要以getScaledMaximumFlingVelocity获取到的该手机支持的极限值作为参考,建议你就设置为1000
mTracker.computeCurrentVelocity(1000, mMaxVelocity);
// 获取该手指水平方向上的速度
float velocityX = mTracker.getXVelocity(mPointerId); 
// 获取该手指垂直方向上的速度
float velocityY = mTracker.getYVelocity(mPointerId);