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 按键事件响应
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 关于Android触摸事件机制 Android触摸事件机制,开发中都是老生常谈,但是惭愧的是,这么久开发,依然对A...
- 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文...
- Android 事件分发和滑动冲突都是开发中经常遇到的难点问题,遇到问题时可能会通过 Google 或者 Stac...
- 1. 概述 作为Android开发中最常见的一个控件,个人觉得有必要谈谈了。我们刚开始接触Android的时候...