一、RecyclerView中触发Fling操作
先看下RecyclerView
的onTouch
方法:
@Override
public boolean onTouchEvent(MotionEvent e) {
case MotionEvent.ACTION_UP: {
mVelocityTracker.addMovement(vtev);
eventAddedToVelocityTracker = true;
mVelocityTracker.computeCurrentVelocity(1000, mMaxFlingVelocity);
final float xvel = canScrollHorizontally
? -mVelocityTracker.getXVelocity(mScrollPointerId) : 0;
final float yvel = canScrollVertically
? -mVelocityTracker.getYVelocity(mScrollPointerId) : 0;
if (!((xvel != 0 || yvel != 0) && fling((int) xvel, (int) yvel))) {
setScrollState(SCROLL_STATE_IDLE);
}
resetTouch();
} break;
}
在up触发的时候会调用native方法去获得X和Y方向的速率:
根据收集的点计算流速。仅当您实际想要检索速度信息时才调用此函数,因为它相对比较昂贵。然后可以使用{@link#getXVelocity()}和{@link#getYVelocity()}检索速度。
@param units您想要的速度单位。值为1表示每秒像素数,1000表示每秒像素数,等等@param maxVelocity此方法可计算的最大速度。此值必须以与units参数相同的单位声明。此值必须为正值。
public void computeCurrentVelocity(int units, float maxVelocity) {
nativeComputeCurrentVelocity(mPtr, units, maxVelocity);
}
如果有其中一个不为0就会调用fling
操作,如果滑动速率小于50的话就不会触发fling操作。
//通过初始速度获取最终滑动距离
//通过需要滑动的距离获取初始速度
//获取滑动的时间
要做到惯性滑动,我们需要做到:
- 得到手指抬起时的速度
- 将速度转换成具体的位移
获取速度
首先,关于如何在ACTION_UP
中得到速度。VelocityTrackerCompat
的getYVelocity
可以获得指定ID的手指当前Y轴上的速度。向上为负,向下为正。
自定义控件的惯性滑动 - 简书