定义触摸事件
在处理触摸事件的时候,主要有两种启动方式
1,view.setOnTouchListener()
2,在自定义view/activity的时候覆盖一个方法onTouchEvent()
这两种方法基本上等效,自定义的时候用方法2,其他时候用方法1。
注意一点,假如在activity里面设置onTouchEvent()
,有时候会不触发。因为如果此activity的子view能处理触摸事件,那么activity的触摸事件就会被忽略
所以,一般情况在VIEW里面定义触摸事件是最好的。
MotionEvent
MotionEvent
onTouchEvent(MotionEvent event){}
在方法体里面要对event
进行判断,是哪一种触摸模式,然后可以从这个event里面获得各种信息
event.getAction()
可以获得所有信息,包括触摸模式,触摸点索引,也就是以下两种信息
event.getActionMasked()
获得触摸模式信息
event.getActionIndex()
获得当前触摸点的索引
一般情况用后面两种分开的信息,第一种包含后面两种信息。后面两种则通过掩码的方法获得特定信息,这样做的好处是节省内存,提高处理效率。
所以,大部分时候我们使用后两种来处理。
Action类别
ACTION_DOWN
( 第一个触摸点触摸事件)
ACTION_UP
( 最后一个触摸点离开事件)
ACTION_POINTER_DOWN
(第二个以及以后的触摸点触摸事件,也就是多点触摸)
ACTION_POINTER_UP
(第二个以及以后的触摸点离开事件)
ACTION_MOVE
(所有的触摸点的移动事件,包括单点的和多点的)
目前为止我就接触到以上事件。要注意的是这里面多点和单点的触摸事件是分开的。
除了MOVE以外。MOVE事件在任何移动的时候都会触发,所以需要通过代码判断是多点还是单点。
触摸信息
getActionIndex()
获得触摸点编号,从0开始,多点触摸的时候,获得的就是当前动作点的编号
比如第二个点触摸,就获得第二个点的编号;第二个点离开,也是第二个点的编号,以此类推。
getX(index)
获得对应编号触摸点的X坐标,Y坐标类似,假如没有参数,那就获得的是编号0的点的信息
需要注意一点,多点触摸的时候,一般按照触摸顺序获得从0开始的编号,如果中间某个点离开,再重新触摸,会获得原来的编号,而不是从最后一个编号往上加。但是比如3点触摸,第一个点离开,编号就是0,第二个点离开,显示编号也是0。
总之,我不好总结触摸点的编号规律,但是通过getActionIndex()
总能获得当前动作的编号,所以,每次都要通过这个方法获得动作编号,不要特么的乱猜。
补充
基本上以上信息就可以获得大部分应用的操作的。
有一点需要补充就是,可能因为对触摸动作比较敏感,
MOVE动作很频繁,即便你以为手指是没动的情况也可能一直在触发MOVE动作
所以,定义MOVE动作一定要谨慎。
(一个小例子,定义移动动作的时候,在ACTION_DOWN动作下获得初始移动点的信息,然后在MOVE动作里面获得目标点信息,启动一个移动动作,从初始点到目标点。最后需要把刚才的目标点定义为初始点。这样才能让移动动作一直执行下去。)