滑动之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. 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);
        }
}
    原文作者:白与兰与白兰地
    原文地址: https://www.jianshu.com/p/7c5d22ba8c3a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞