dispatchTouchEvent(),onInterceptTouchEvent()和onTouchEvent()的事件分发

在布局文件里,假设有3层 , 一层是button, textview等常见组件, 二层是嵌套的RelativeLayout, 三层是LinearLayout, 而一个触摸屏幕的事件无非就是ACTION_DOWN, ACTION_MOVE, ACTION_UP.  而手指从按下到松开离开屏幕, 其实事件分发的传递已经经过了这三层. 这里说下它的处理过程, 也算是巩固记忆了.

首先, dispatchTouchEvent(),onInterceptTouchEvent()和onTouchEvent() 这三个方法在每个view都会有, 而无论button,textview还是LinearLayout, RelativeLayout它们最终都继承于View, ViewGroup,因此 这三个方法它们各自都有. dispatchTouchEvent() 负责触摸屏幕事件(down - move - up)的分发, onInterceptTouchEvent()负责事件中的拦截, onTouchEvent()就是事件的处理了.

接着,来说说这三层中各自的三个方法如何参与了这个过程:

从Activity开始, 接收到手指按下屏幕的事件,即ACTION_DOWN, 最先到达LinearLayout, LinearLayout调用dispatchTouchEvent(), dispatchTouchEvent()一般不会用于重写, 它会自动分发给onInterceptTouchEvent(),如果onInterceptTouchEvent()的ACTION_DOWN 里面返回fasle就代表自己不处理这个事件,而是交给下一个去处理它,
于是继续把这个事件分发到下一层RelativeLayout, 同理RelativeLayout中如果onInterceptTouchEvent()的ACTION_DOWN依旧返回false的话, 就到达TextView这里. 当TextView的onInterceptTouchEvent())中返回true了 , 就代表由自己来处理这个事件, 也相当于拦截了这个事件.当处理完,返回true就将事件的处理结果逆向提交到Activity中, 告诉Activity自己处理好了. 然后接下来的ACTION_MOVE和ACTION_UP这两个事件才会继续传到TextView中并得到处理.

假如,刚开始的ACTION_DOWN在RelativeLayout就被处理掉 (即 RelativeLayout中的onInterceptTouchEvent()返回true,交由自己的onTouchEvent()去处理, 下层的TextView就无法参与这次触摸事件的传递分发, 后面的ACTION_MOVE和ACTION_UP, TextView也就无法得到传递).所以如果要拦截某一个TOUCH动作,就在onInterceptTouchEvent()动手吧(嘻嘻,这样说好理解一些嘛.)
只要拦截了ACTION_DOWN,后面的MOVE和UP事件都不会往下传递, 而只拦截MOVE事件, 则UP事件不再往下传递. 但无论是哪个View处理了这次的触摸事件, 其最后处理的结果都必须会逆向地提交到Activity中, 这样用户触摸屏幕的动作才会得到对应的反馈.

时间: 2024-08-14 10:16:41

dispatchTouchEvent(),onInterceptTouchEvent()和onTouchEvent()的事件分发的相关文章

Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解

[转]http://blog.csdn.net/guitk/article/details/7057155 onInterceptTouchEvent用于改变事件的传递方向.决定传递方向的是返回值,返回为false时事件会传递给子控件,返回值为true时事件会传递给当前控件的onTouchEvent(),这就是所谓的Intercept(拦截). [tisa ps:正确的使用方法是,在此方法内仅判断事件是否需要拦截,然后返回.即便需要拦截也应该直接返回true,然后由onTouchEvent方法进

Android View的事件分发机制

准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup.如RelativeLayout.LinearLayout.作为一个开发人员,我们会思考.当点击一个button,Android系统是如何确定我点的就是button而不是TextView的?然后还正确的响应了button的点击事件. 内部经过了一系列什么过程呢? 先铺垫一些知识能更加清晰的理解事件分

Android事件分发机制理解

预备知识 触摸事件 : 安卓中把触摸事件封装成了一个类MotionEvent,用户的一次点击.触摸或者滑动都会产生一系列的MotionEvent 这个类的内容很简单,就两个东西:事件类型+坐标xy 事件类型有四种 MotionEvent.ACTION_DOWN 表示用户的手指刚接触到屏幕 MotionEvent.ACTION_MOVE 表示用户的手指正在移动 MotionEvent.ACTION_UP 表示用户的手指从屏幕上抬起 Cancel 所以一次用户触摸屏幕可能会产生这些事件: 点击屏幕然

View的事件分发,女神带你飞

事件的分发原理图: 对于一个root viewgroup来说,如果接受了一个点击事件,那么首先会调用他的dispatchTouchEvent方法. 如果这个viewgroup的onInterceptTouchEvent 返回true,那就代表要拦截这个事件.接下来这个事件就 给viewgroup自己处理了,从而viewgroup的onTouchEvent方法就会被调用.如果如果这个viewgroup的onInterceptTouchEvent 返回false就代表我不拦截这个事件,然后就把这个事

Android Touch事件分发机制学习

Android  事件分发机制 ViewGroup dispatchTouchEvent 返回true dispatchTouchEvent: Activity ACTION_DOWN MyrelativeLayout dispatchTouchEvent: ACTION_DOWN dispatchTouchEvent: Activity ACTION_UP MyrelativeLayout dispatchTouchEvent: ACTION_UP ViewGroup自己在dispatchTo

android事件分发流程

1.描述 说到android事件的分发机制,真的是感觉既熟悉又陌生,因为每次需要用到的时候查看相关的源码,总能找到一些所以然来,但是要根据自己理解从头到尾说一遍,却一点都说不上.总结原因吧,感觉是自己不善于总结,过目就忘,并没有把心思放在上面,自然也就没有一点概念咯~~所以在这里主要是把自己理解的一些东西记录下来,不涉及源代码. 好吧,接下来简单说说android事件分发流程吧,说到事件分发,首先应该想到的是两个类,View和ViewGroup,ViewGroup是继承自View实现的,View

Android的事件分发与消费机制

一.Touch的三个重要方法 在Android中,与触摸事件也就是 Touch 相关的有三个重要方法,这三个方法共同完成触摸事件的分发. public boolean dispatchTouchEvent(MotionEvent ev) :事件分发 public boolean onInterceptTouchEvent(MotionEvent ev):事件拦截 public boolean onTouchEvent(MotionEvent ev):事件响应 下面就依次来分析这三个方法. 1.事

【自定义控件】android事件分发机制

自定义控件中我们经常也许会经常碰到这样的情况,自己加了一些点击,滑动的事件的处理判断导致另外一些控件点击,滑动没有用了,滑动反应反应很慢,要划很多次猜移动一点点等等.也许我们第一反应就是百度,google去搜索下答案,把代码直接copy过来.其实也许可以换个解决办法,自己想想为什么会出现这种情况. 以下是博主对android事件分发机制的初步探索.希望大家看完后能对Android事件分发机制有一个详细的了解,以后不用百度,google也能轻松解决由于事件冲突导致各种问题. 首先我们要对Andro

android 开发-ListView与ScrollView事件冲突处理(事件分发机制处理)

ListView和ScrollView都存在滚动的效果,所以一般不建议listView和scrollView进行嵌套使用,但有些需求则需要用到两者嵌套.在android的学习中学了一种事件分发处理机制. 如果listView显示在UI上部,而如imageView等显示在UI下部. 首先为listView注册一个滑动监听事件 通过为listView设置固定高度,并注册滑动监听事件.在划动监听事件中,记录用户是否滑动至listView数据底部. 通过activity的dispatchTouchEve