Android 按键事件响应
-
Android的TouchEvent通常包含三个动作,ACTION_DOWN,ACTION_MOVE与ACTION_UP。
发出的顺序是DOWN->MOVE->MOVE->…->UP(注意MOVE事件是否能够被触发取决于操作手势里面是否包含了移动的动作)。 -
消息分发流程,从上到下,从父到子:Activity->ViewGroup1->ViewGroup1的子ViewGroup2->…->Target View
-
消息响应流程,从下到上,从子到父:Target View->…->ViewGroup1的子ViewGroup2->ViewGroup1->Activity
-
总结:
1、事件入口是dispatchTouchEvent(),它会先执行注册的onTouch监听,如果一切顺利的话,接着执行onTouchEvent,在onTouchEvent里会执行onClick监听。
2、无论是dispatchTouchEvent还是onTouchEvent,如果返回true表示这个事件已经被消费、处理了,不再往下传了。在dispathTouchEvent的源码里可以看到,如果onTouchEvent返回了true,那么它也返回true。如果在执行onTouch监听的时候,onTouch返回了true,那么它也返回true,这个事件提前被onTouch消费掉了。就不再执行onTouchEvent了,更别说onClick监听了。 -
onTouch()->onTouchEvent()->onClick()->onLongClick() .是否能够顺序执行,取决于每个方法的返回值是true还是false。
-
onInterceptTouchEvent代表拦截,如果返回false,说明不拦截,向下传递;如果返回true,代表拦截.
-
dispatchTouchEvent方法用于事件的分发。返回true表示不继续分发,事件被消费。返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。
-
onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。
-
onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,因为ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的。
-
大顺序是这样的:dispatchTouchEvent - onInterceptTouchEvent - onTouch - onTouchEvent - onClick
-
在Activity,View,ViewGroup中,这些方法的存在与否如下:
Activity只有dispatchTouchEvent 和onTouchEvent方法.
View中有dispatchTouchEvent,onTouchEvent
ViewGroup中有dispatchTouchEvent,onInterceptTouchEvent ,onTouchEvent .而onTouch和onClick方法,则是通过setonXXListener的方式来增加的,Activity不可以set这两个方法.这样我们就可以解释为什么要有onTouch和onTouchEvent两个方法了.