android事件传递机制的浅谈

想必大家有时会遇到需要自定义控件吧,这个时候就会遇到事件的传递和处理了,非常繁琐啊!百度上面一大票关于事件的传递机制,但是都千篇一律,都是dispatchTouchEvent

返回true,则事件被拦截,false则分发给子控件之类的,经过几天的研究发现这个事件传递并没有说的这么简单也没有想象中的难。

一般的点击事件、滑动事件都是用ACTION_UP、ACTION_MOE、ACTION_DOWN组成的,android应用里面默认情况下,触摸事件是从activity开始传递,假设里面的view都不需要拦截事件,那么这个触摸事件会沿着里面的视图走一圈再回到activity,如果我们对某一个view绑定了一个事件监听器,那么这个事件只能被一个view消费。

其实以上说的大家一般都清楚,但是当需要重写某个控件的时候又会犯难了,因为光知道以上的还不够,这个时候我们需要去看源码研究下,通过俺的鼓捣,发现了事件传递的规律:

activity的传递顺序:dispatchTouchEvent 事件传递给window→ window传递给里面的view→view的dispatchTouchEvent 

viewgroup的传递顺序:dispatchTouchEvent →onInterceptTouchEvent→事件传递给下一层→onTouchEvent

其实一个触摸事件不管是activity还是viewgroup、view,都是从dispatchTouchEvent这个回调函数开始,里面会把触摸事件传给它的下一层,如果他的下一层dispatchTouchEvent返回了ture,则这个事件就回不去了,因为被下一层拦截到了,onTouchEvent方法只是在dispatchTouchEvent中最后调用的,因为会先把事件传递给下一层,如果下一层不要了才会执行到调用onTouchEvent这一步,而onInterceptTouchEvent只有viewgroup中才有,是对事件的再一次拦截。

这个是系统默认方式,但是如果重写上面的dispatchTouchEvent
方法,就可以颠覆这个默认的规律,比如viewgroup传递给它的子view,我在他们的相关事件拦截方法里面都返回false,然后对他们都各自处理自己的事件,那么这样就不是一个事件只能被一个视图消费了,暂时就水到这,这只是自己的一点心得,欢迎大家互相学习交流

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 01:35:19

android事件传递机制的浅谈的相关文章

android事件传递机制详解

本篇内容将结合Android源码来分析Android的事件传递机制.众所周知,点按.滑动.触摸构成了Android等智能设备的基本操作,几乎所有的应用都通过对触摸屏的操作来进行应用程序的使用.那么,在Android中,触摸事件是如何响应及传递的呢,通过本篇内容你将有一个初步的了解. 实验环境 OS X 10.9 Eclipse(ADT) Android源码版本:API Level 19(Android 4.4) Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点

Android事件传递机制(转)

Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都由如下三个部分作为基础: 按下(ACTION_DOWN) 移动(ACTION_MOVE) 抬起(ACTION_UP) 所有的操作事件首先必须执行的是按下操作(ACTIONDOWN),之后所有的操作都是以按下操作作为前提,当按下操作完成后,接下来可能是一段移动(ACTIONMOVE)然后抬起(ACTI

Android事件传递机制

实验环境 OS X 10.9 Eclipse(ADT) Android源码版本:API Level 19(Android 4.4) Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都由如下三个部分作为基础: 按下(ACTION_DOWN) 移动(ACTION_MOVE) 抬起(ACTION_UP) 所有的操作事件首先必须执行的是按下操作(ACTIO

Android事件传递机制详解及最新源码分析——ViewGroup篇

在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴,强烈建议先阅读上一篇. 好了,废话还是少说,直奔主题,开始本篇的ViewGroup事件传递机制探索之旅. 依然从简单的Demo例子现象开始分析 新建安卓工程,首先自定义一个Button以及一个RelativeLayout,很简单,只是重写了主要与事件传递机制相关的方法,代码如下: 自定义WLButton类: 1 public class WLButton e

转:Android事件传递机制

转:这里 本文为InfoQ中文站特供稿件,首发地址为:http://www.infoq.com/cn/articles/android-event-delivery-mechanism.如需转载,请与InfoQ中文站联系. 运用的前提是掌握掌握的本质是理解 本篇内容将结合Android源码来分析Android的事件传递机制.众所周知,点按.滑动.触摸构成了Android等智能设备的基本操作,几乎所有的应用都通过对触摸屏的操作来进行应用程序的使用.那么,在Android中,触摸事件是如何响应及传递

细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)

本文背景:前些天用到了之前写的自定义图片文字复合控件,在给他设置监听时遇到了麻烦.虽然最后解决了问题,但发现在不重写LinearLayout的onInterceptTouchEvent时,子ImageView.子TextView.父Linearlayout三者不同的属性配置(android:clickable android:focuseable)会造成自定义控件onClick监听失败.或成功.复写了父Linearlayout 的onInterceptTouchEvent时,监听不受子图片.子文

Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)

一.View的dispatchTouchEvent和onTouchEvent 探讨Android事件传递机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件,没有子布局的,如Button.TextView. ViewGroup继承自View,表示可以有子控件,如Linearlayout.Listview这些.而事件即MotionEvent,最重要的有3个: (1)MotionEvent.ACTION_DOWN  按下View,是所有事件的开始 (2)M

android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事

总结的不是很好,自己也有点看不懂,正好现在用到了,研究了一个,再次总结,方便大家查看 总则: 1.onInterceptTouchEvent中有个Intercept,这是什么意思呢?她叫拦截,你大概知道她作用了吧,她就是你的亲亲小秘书,有什么事,先找秘书,秘书来决定这个事要不要你亲自处理,既然是秘书,是不是每个人都能有呢?当然不是,这个秘书只是viewgroup的,所以只有继承viewgroup的控件才有,那些textview啊button啊什么的,肯定是没有的,为什么?因为他级别不够(继承自v

android 事件传递机制 心得

看了网上很多资料. 最后我发现可以用很简单的几句话就能把它说清楚 1 每个 viewgroup 内都有 三个方法 a dispatchTouchEvent 是自己决定要不要(管他爹)要这个苹果的 一般使用方法是 在此方法内 getParent().requestDisallowInterceptTouchEvent(false/true) true表示要了, 苹果拿到手 false 表示 不要了,那这个苹果还在他爹那里 b onintercepTouchEvent 是这个苹果要不要往下发的,(到