之前总结过一篇关于view的文章,本文更多的是总结了一些常用MotionEvent的相关知识。
MotionEvent的产生
简单翻译就是移动事件,触摸事件等等。就是当用户的手指在屏幕上操作的时候产生了一个MotionEvent对象。这个对象里包含了触摸的位置及时间等信息。
获取MotionEvent对象
- 在Activity中重载 onTouchEvent 方法
- 调用某个View的.setOnTouchListener并实现onTouch方法。(这里的View
首字母大写了,是泛指所有继承View类的控件)
MotionEvent方法
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
这个函数的返回值是一个boolean型的。关于返回值的问题,之后我们会在另外的文章中讨论。但是它的基本原则就是:如果return true,那么表示该方法消费了此次事件,如果return false,那么表示该方法并未处理完全,该事件仍然需要以某种方式传递下去继续等待处理。关于这个方法的描述:Return true if you have consumed the event, false if you haven't. The default implementation always returns false.
event.getXXX();
- getAction()方法返回的是int类型,用到的只有低16位,其中:低八位是动作的类型,高8位是触摸点索引值的表示(单点为0,双点为1)
获得动作类型的俩种方法
int action = event.getAction() & MotionEvent.ACTION_MASK;
int action2 = event.getActionMasked();
获得触摸点索引类型的俩种方法
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int pointerIndex2 = event.getActionIndex();
- 事件发生的位置
event.getX();Returns the X coordinate of this event for the given pointer。
event.getY();
event.getRawX();Returns the original raw X coordinate of this event。
event.getRawY();
这俩组方法的区别就在于:
getX() 返回的是相对于当前view左上角的X坐标;
而getRawX返回的是相对于手机屏幕上左上角的X坐标。
- 事件发生的时间
event.getDownTime(); 按下时的时间
event.getEventTime(); 事件发生的当前时间
- 事件的类型
switch(action) {
case MotionEvent.ACTION_DOWN: break;
case MotionEvent.ACTION_MOVE: break;
case MotionEvent.ACTION_UP: break;
}
这是三种事件最常用的类型,当然还有一些其他的类型。
- 关于
MotionEvent提供的方法中,和事件类型中,会有Pointer的概念,比如getPointerId()和ACTION_POINTER_DOWN。pointer是什么呢?其实一个pointer就是一个触摸点。如果还是不能理解,就直接可以理解为一个pointer就是一个手指。大家都知道android的触摸可以分为单点触摸和多点触摸,而pointer就是区分这俩种情况的。
关于这部分内容大家可以看这里的一篇帖子。
VelocityTracker 滑动速度?
// 第一步 在View的 onTouchEvent方法中追踪当前单击事件的速度
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
// 第二步 计算速度
velocityTracker.computeCurrentVelocity(1000);
// 获取X轴和Y轴上的速度
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
// 重置和回收内存
velocityTracker.clear();
velocityTracker.recycle();