昨天写程序的时候,碰到一个很棘手的问题,牵扯到OnTouch事件和MotionEvent事件,网上虽然有一些说明,但是对于我想要知道的不是很完整,比较零散,这里就总结一下android中的Ontouch机制。
要理解OnTouch机制,首先得明白有哪些OnTouch事件,常用的有这么四种:
ACTION_DOWN
这个是OnTouchEvent事件的开始,任何事件都必须手指按下去才行。这个事件是一个从触摸屏无触摸状态到有触摸状态的转换。
ACTION_MOVE
紧接着的Move事件,可能有人会以为手指移动就会调用这个MOVE,但是经我测试并非如此,这个事件,只要手指在屏幕上,即使不动也会调用。
ACTION_UP
触摸事件的结束,正常情况下,手指离开屏幕;触摸屏从有触摸状态到无触摸状态的转换。
ACTION_CANCEL
这个不是独特的触摸事件,而是由系统来判定的,一般认为你的手指从屏幕上你要点击的区域移出来,就cancel掉了。很简单的例子,你点击一个按钮,点击的时候,按钮变颜色,只要你的手指不拿开,按钮不会变回原来的颜色。这时候你手指拿开了,按钮颜色变回去,你就触发了ACTION_UP的事件;或者你的手指移出按钮区域了,按钮颜色也变回去,这时候你触发了ACTION_CANCEL事件,你点击按钮的方法也不会被触发。
我们知道,android中的View是按照一个View Hierarchy来组织的。而且,在设定onTouch事件的时候,触摸的顺序也是走的这个View Hierarchy从上往下传递,叫做dispatch。
ViewGroup里面有一个方法决定了这个ViewGroup的dispatch方式:
OnInterceptTouchEvent(MotionEvent ev)
这个方法由系统自己调用,但是在写自己的ViewGroup的时候,可以复写,工作过程和返回值说明如下: