Android触控(一) 关于MotionEvent的学习
MotionEvent事件对象
一般来说我们都是在View的onTouchEvent方法中来处理MotionEvent对象的。
public boolean onTouchEvent(MoitonEvent event){ int action = MotionEventCompat.getActionMasked(event); switch(action) { case (MotionEvent.ACTION_DOWN) : Log.d("DEBUG_TAG","Action was DOWN"); return true; case (MotionEvent.ACTION_MOVE) : Log.d("DEBUG_TAG","Action was MOVE"); return true; case (MotionEvent.ACTION_UP) : Log.d("DEBUG_TAG","Action was UP"); return true; case (MotionEvent.ACTION_CANCEL) : Log.d("DEBUG_TAG","Action was CANCEL"); return true; case (MotionEvent.ACTION_OUTSIDE) : Log.d("DEBUG_TAG","Movement occurred outside bounds of current screen element"); return true; default : return super.onTouchEvent(event); }
然后,获取事件的类型,获取事件发生的位置x、y轴坐标,根据位置来判断触发处理事件
(1)事件的类型
一般通过event.getAction()获得事件类型,在android 2.2加入多点触控支持后,使用getActionMasked()方法获得。
主要事件有:
ACTION_DOWN 用户开始触摸(单点)
ACTION_MOVE
ACTION_UP 用户抬起手指
ACTION_CANCEL 表示首饰被取消了
ACTION_OUTSIDE 表示触摸超出了正常的UI边界
多点触摸:
ACTION_POINTER_DOWN 非主要触摸按下
ACTION_POINTER_UP 非主要触摸抬起
ACTION_POINTER_DOWN 非主要触摸按下
ACTION_POINTER_UP 非主要触摸抬起
事件的类型是int类型,用到的只有低8位
(2)事件发生的位置(坐标)
这里提一下几个坐标获取方法:
getX() 是表示widget相对于自身左上角的x坐标
getRawX() 表示相对于屏幕左上角的x坐标(这个坐标是手机的屏幕左上角,不管activity是否有titleBar或是否全屏)
getY() getRawY()同理
getTop() 按钮左上角相对于父view的y坐标
getLeft() 按钮左上角相对于父view的x坐标
getX(int pointerIndex)方法得到指定触摸索引的X坐标
getY(int pointerIndex)方法得到指定触摸索引的Y坐标
MotionEvent的getPointerCount()方法,可以检查当前屏幕有多少个触摸点
(3)关于getActionMasked()和getActionIndex()方法
这里需要提到动作掩码和触摸点索引掩码:
动作掩码 ACTION_MASK = 0x000000ff
触摸点索引掩码 ACTION_POINTER_INDEX_MASK = 0x0000ff00
getAction()方法返回的是int类型数值,用到的只有低16位即0x0000~0xffff。其中,低8位是触摸事件类型,高8位是触摸点索引值表示(单点为0,双点为1……)。
getActionMasked()方法,是将传来的动作值和ACTION_MASK动作掩码进行了与运算,将索引清0,得到纯动作值。
getActionIndex()方法,是将传来的动作值和ACTION_POINTER_INDEX_MASK触摸点索引掩码进行与运算再移位,得到纯索引值。
(4)一般使用建议
一般我们要处理动作,推荐用switch结构,判断变量为:getActionMasked(),这样里面判断的动作可以是单点或多点触摸。