滑动之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

推荐使用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);
        }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容