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