• 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 & 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,放开相应的手指数量会返回相应的值。

  • 相关阅读:
    jQuery对象和DOM对象的互转
    ASP.NET MVC单元测试Controller时添加上下文的方式
    基于Mongodb进行分布式数据存储【转】
    .NET平台上的编译器不完全列表
    实现自己的O/R Mapping组件高效缓存的思考
    .NET的动态语言
    C++类成员和数据成员初始化总结
    ACE Singleton
    Wiresshark
    C++
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4048321.html
Copyright © 2020-2023  润新知