Android 按键事件响应

作者: lee_3do | 来源:发表于2015-11-09 14:17 被阅读215次
    • 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两个方法了.

    相关文章

      网友评论

        本文标题:Android 按键事件响应

        本文链接:https://www.haomeiwen.com/subject/kbxhhttx.html