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     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_POINTER_3_DOWN     0x00000205            ACTION_POINTER_3_UP      0x00000206

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

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

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




fatkun

12条评论

你对了。。。我把0×00000105转换错了。。。囧应该是 0×00000105 = 1 0000 0101(2)的。。。囧。。结果就是0101(2)=0x0000005

发表评论

电子邮件地址不会被公开。