滑动之Fling
2019-05-16 本文已影响5人
白与兰与白兰地
1. fling基础(未考虑多指滑动)
初始化
//获取认为是fling的最小速率
mMinimumFlingVelocity= ViewConfiguration.get(context).getScaledMinimumFlingVelocity();
//借助VelocityTracker速率辅助计算类在onTouchEvent中处理
initVelocityTracker();
mVelocityTracker.addMovement(event);
fling动作是在手指完全抬起后发生的,因此在MotionEvent.ACTION_UP
中处理
//计算当前滑动速率,该方法性能消耗很大,参数单位为毫秒
mVelocityTracker.computeCurrentVelocity(1000);
//获取计算后得到的X轴滑动速率
int initVelocity = (int) mVelocityTracker.getXVelocity();
//快速向右滑动|| 快速向左滑动
if (initVelocity > mMinimumFlingVelocity|| initVelocity < -mMinimumFlingVelocity) {
mScroller.fling(getScrollX(), getScrollY(), -initVelocity, 0, (int) mLeftEdge, (int) mRightEdge, getScrollY(), getScrollY());
}
//缓慢滑动不处理
else {
}
最后一定记得在MotionEvent.ACTION_UP
和MotionEvent.ACTION_CANCEL
中释放资源
recycleVelocityTracker();
private void recycleVelocityTracker() {
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
mVelocityTracker = null;
}
}
private void initVelocityTracker() {
mVelocityTracker = mVelocityTracker == null ? mVelocityTracker = VelocityTracker.obtain() : mVelocityTracker;
}
2. fling推荐
推荐使用GestureDetector
处理手势,其内部封装了一系列常用手势,并以回调的方式通知手势发生
mGestureDetector = new GestureDetector(context, gestureListener);
mGestureDetector.onTouchEvent(event);
private GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {
//惯性滑动
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//注意,使用Scroller类需要手动invalidate,这样computeScroll才会在重绘时被调用
mScroller.fling(getScrollX(), getScrollY(), (int) -velocityX, 0, (int) mLeftEdge, (int) mRightEdge, getScrollY(), getScrollY());
invalidate();
return super.onFling(e1, e2, velocityX, velocityY);
}
}