首页 > 代码库 > event.getAction()&MotionEvent.ACTION_MASK的原因

event.getAction()&MotionEvent.ACTION_MASK的原因

看到下面代码中用了AND位运算是为了什么呢?

	public boolean onTouchEvent(MotionEvent event) {		int action = event.getAction();		switch (action & MotionEvent.ACTION_MASK) {		case MotionEvent.ACTION_DOWN:			showMsg("ACTION_DOWN" + action);			break;		case MotionEvent.ACTION_UP:			showMsg("ACTION_UP" + action);			break;		case MotionEvent.ACTION_POINTER_UP:			showMsg("ACTION_POINTER_UP" + action);			break;		case MotionEvent.ACTION_POINTER_DOWN:			showMsg("ACTION_POINTER_DOWN" + action);			break;		}		return super.onTouchEvent(event);	}

首先来看看这些常量的值

ACTION_MASK     0x000000ffACTION_DOWN     0x00000000         ACTION_UP      0x00000001        ACTION_MOVE      0x00000002ACTION_POINTER_DOWN       0x00000005            ACTION_POINTER_UP        0x00000006ACTION_POINTER_1_DOWN     0x00000005            ACTION_POINTER_1_UP      0x00000006ACTION_POINTER_2_DOWN     0x00000105            ACTION_POINTER_2_UP      0x00000106ACTION_POINTER_3_DOWN     0x00000205            ACTION_POINTER_3_UP      0x00000206

看到这么多16进制有没有怕呢。。。我数学不太好,看着有点怕呢~
先做做十六进制AND运算
来看看ACTION_MASK & ACTION_POINTER_2_DOWN 即 0x000000ff & 0×00000105
换成二进制 1111 1111(2) & 1 0000 0110(2) = 0110(2) = 0×00000006

update:上面换算错了。。囧,应该是 1111 1111(2) & 1 0000 0101(2) = 0101(2) = 0×00000005
如果不会换算,试试用计算器啦。。(掩面,我也是用计算器,快速计算的方法是把16进制的每一位扩展为4位的二进制)
可以看到,and运算的结果总是小于等于0x000000ff,那就是说and之后,无论你多少根手指加进来,都是会ACTION_POINTER_DOWN或者ACTION_POINTER_UP

补充一下,当第二个手指触摸屏幕时,event.getAction()的值是0×00000105,第三个手指触摸是0×00000205,放开相应的手指数量会返回相应的值。

event.getAction()&MotionEvent.ACTION_MASK的原因