滑动之Fling

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_UPMotionEvent.ACTION_CANCEL中释放资源
recycleVelocityTracker(); private void recycleVelocityTracker() { if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } }private void initVelocityTracker() { mVelocityTracker = mVelocityTracker == null ? mVelocityTracker = VelocityTracker.obtain() : mVelocityTracker; }

2. 手势处理之GestureDetector
【滑动之Fling】推荐使用GestureDetector处理手势,其内部封装了一系列常用手势,通过Callback可以轻松处理:
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); } }

    推荐阅读