Android用一个32位的整型值表示一次TouchEvent事件,低8位表示touch事件的具体动作,比如按下,抬起,滑动,还有多点触控时的按下,抬起,这个和单点是区分开的,下面看具体的方法:
1.getAction:触摸动作的原始32位信息,包括事件的动作,触控点信息
2.getActionMasked:触摸的动作,按下,抬起,滑动,多点按下,多点抬起
3.getActionIndex:触控点信息
public final int getAction() {
return mAction;
}
public final int getActionMasked() {
return mAction & ACTION_MASK;
}
这些action的常量的值:
ACTION_MASK 0x000000ff
ACTION_DOWN 0x00000000
ACTION_UP 0x00000001
ACTION_MOVE 0x00000002
ACTION_POINTER_DOWN 0x00000005
ACTION_POINTER_UP 0x00000006
ACTION_POINTER_1_DOWN 0x00000005
ACTION_POINTER_1_UP 0x00000006
ACTION_POINTER_2_DOWN 0x00000105
ACTION_POINTER_2_UP 0x00000106
例如:ACTION_MASK & ACTION_POINTER_2_DOWN 即0x000000ff & 0×00000105=0x0000005
可以看到,and运算的结果总是小于等于0x000000ff,那就是说and之后,无论你多少根手指加进来,都是会ACTION_POINTER_DOWN或者ACTION_POINTER_UP
如果mAction的值是在0x00到0xff之间的话。getAction()返回的值,和getActionMasked()的返回的值是一样的。
那什么时候返回的值不一样呢?
即当mAction值大于0xff时,那什么时候会大于0xff呢?
这就是,当有多点触控时,mAction的低8位即0x00到0xff用来表示动作的类型信息。
例如:MotionEvent#ACTION_DOWN的值是 0,即0x00。
MotionEvent#ACTION_UP的值是 1,即0x01。
但是,我们知道Android是支持多点触控的,那么怎么知道这个一个MotionEvent是哪一个触控点触发的呢?那么就还需要MotionEvent带有触控点索引信息。
Android的解决方案是:在mAction的第二个8位中存储。
例如,如果mAction的值是0x0000,则表示是第一个触控点的ACTION_DOWN操作。
如果mAction的值是0x0100呢,则表示是第二个触控点的ACTION_DOWN操作。
第三个的ACTION_DOWN呢?相信你可以推出来是0x0200。
总而言之,mAction时的低8位(也就是0-7位)是动作类型信息。
mAction的8-15位呢,是触控点的索引信息。(即表示是哪一个触控点的事件)。