Android自定义View滑动事件处理总结

时间:2024-10-04 11:04:44

滑动处理需要用到的各种工具类:

android.view.VelocityTracker

android.view.OverScroller

android.view.ViewConfiguration

VelocityTracker类 

主要用跟踪触摸屏事件(flinging事件和其他gestures手势事件)的速率。

用addMovement(MotionEvent)函数将Motion event加入到VelocityTracker类实例中。你可以使用getXVelocity() 或getXVelocity()获得横向和竖向的速率,但是使用它们之前请先调用computeCurrentVelocity(int units)来初始化速率的单位 。

computeCurrentVelocity(int units, float maxVelocity)

unitis表示速率的基本时间单位。unitis值为1的表示是,一毫秒时间单位内运动了多少个像素, unitis值为1000表示一秒(1000毫秒)时间单位内运动了多少个像素
maxVelocity表示速率的最大值 
 @Override
public boolean onTouchEvent(MotionEvent event) {
// 获得允许执行一个fling手势动作的最大速度值
int mMaximumVelocity = ViewConfiguration.get(context)
.getScaledMaximumFlingVelocity(); // 实例化
VelocityTracker mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(event);
int action = event.getAction();
float y = event.getY(); switch (action) {
case MotionEvent.ACTION_DOWN: return true;
case MotionEvent.ACTION_MOVE: break;
case MotionEvent.ACTION_CANCEL:
// 回收
mVelocityTracker.recycle(); break;
case MotionEvent.ACTION_UP:
// 初始化速率的单位
mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
int velocityY = (int) mVelocityTracker.getYVelocity(); // 回收
mVelocityTracker.recycle(); break;
} return super.onTouchEvent(event);
}

OverScroller类

是为了实现View平滑滚动的一个Helper类。它的作用就是辅助记录和计算我们滑动的距离和速度这些,用于自定义移动时帮我们处理掉数学的计算部分。

 OverScroller mScroller = new OverScroller(context);
//滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间
mScroller.startScroll(int startX, int startY, int dx, int dy)
//使用默认完成时间250ms
mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)
//返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。
mScroller.computeScrollOffset()

设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。

ViewConfiguration类

这个类主要定义了UI中所使用到的标准常量,像超时、尺寸、距离,如果我们需要得到这些常量的数据,我们就可以通过这个类来获取

  //获得触发移动事件的最短距离,如果小于这个距离就不触发移动控件
int mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
//获得允许执行一个fling手势动作的最大速度值
int mMaximumVelocity = ViewConfiguration.get(context).getScaledMaximumFlingVelocity();
//获得允许执行一个fling手势动作的最小速度值
int mMinimumVelocity = ViewConfiguration.get(context).getScaledMinimumFlingVelocity();

如果布局控件以及其子控件的尺寸进行精确的控制那就要重写下面这个方法了

onMeasure(int widthMeasureSpec, int heightMeasureSpec)