Android事件-MotionEvent

Posted by Young Ken on 2016-08-13

MotionEvent

当你的手指按到屏幕的时候,这个时候就产生了一个事件,这个事件的属性封装在MotionEvent,包括事件的时间,事件的类型等等。

手指的个数

  • getPointerCount() 当前事件发生的时候有屏幕上有几个手指,这个数是大于等于1的。
  • getActionIndex() 这个方法非常有意思,这个是当前手指的索引。现在我们有一个手指按下,这个索引是0,当再有一个手指按下,这个索引是1,当再有一个手按下的时候这个索引是2,现在我们有三个手指按在屏幕上了。现在我们抬起第一个按下的手指,触发事件的索引是0,当我们再抬起第3个手指的的时候这个触发事件的索引是1,这个时候我们就明白了,总结一下上面的这段话。其实getActionIndex()就是一个数组。

事件类型

Android把事件分成不同情况,当手指按到屏幕上会触发一个ACTION_DOWN类型的事件。

  • ACTION_DOWN 当第一个手指按下的时候回触发这个事件。
  • ACTION_MOVE 当第个手指按下,再移动就会触发移动事件。
  • ACTION_UP 当屏幕上的最后一个手指抬起的时候触发这个事件。
  • ACTION_POINTER_DOWN 当屏幕手指数大于1,手指按下的时候触发。
  • ACTION_POINTER_UP 当屏幕手指数大于1,手指抬起的时候触发。
  • ACTION_CANCEL 取消事件

getAction()和getActionMasked()的区别

先看看源代码

1
2
3
4
5
6
7
8
9
public static final int ACTION_MASK = 0xff;
public final int getAction() {
return nativeGetAction(mNativePtr);
}
public final int getActionMasked() {
return nativeGetAction(mNativePtr) & ACTION_MASK;
}

事件类型是0x00到0xff。ACTION_DOWN是0x00,ACTION_MOVE是0x01。这是一个手指,大家都知道Android是支持多个手指同时触发发的。那么多个手指怎么办呢,第一个手指按下是0x0000,第二个手指按下时0x0100。0x00ff到0xffff表示的是当前第几个手指。

要想得到那个手指当前的事件可有用getActionIndex()getActionMasked()相结合。

当前的坐标位置

  • getRawY(),getRawX() 相对于屏幕的坐标。
  • getX(),getY() 相对于控件的坐标。

相关参考