面试:Android Fling 惯性滑动原理
一、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操作。
二、Android 如何知道fling velocity的距离、时间 根据滑动距离得到velocity
//通过初始速度获取最终滑动距离
//通过需要滑动的距离获取初始速度
//获取滑动的时间
要做到惯性滑动,我们需要做到:
- 得到手指抬起时的速度
- 将速度转换成具体的位移
获取速度
首先,关于如何在ACTION_UP中得到速度。VelocityTrackerCompat的getYVelocity可以获得指定ID的手指当前Y轴上的速度。向上为负,向下为正。
自定义控件的惯性滑动 - 简书
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
