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的时候...