滑动之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_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. 手势处理之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);
}
}
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- python学习之|python学习之 实现QQ自动发送消息