Android的事件分发机制 ---dispatcTouchEvent、onInterceptTouchEvent、onTouchEvent
来源:互联网 发布:最后的武士 知乎 编辑:程序博客网 时间:2024/05/17 05:52
想自己定义一个控件,简单的还好,特别是继承ViewGroup的时候,子元素一多,按这个怎么没效果,按那个没效果,或者是混乱了。 这下,你就得知道要通过view的事件的分发来控制了。
事件分发的三个重要方法dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()。
这三个方法返回的类型都是boolean类型,返回true都是说自己消费了这个touch事件,不需要下一层再去管了。
接下来就讲讲这3个方法的区别:
(1)dispatchTouchEvent(): 用来事件的分发。 如果事件能够传递给当前事件,那么此方法一定就会被调用,意思就是该View的父容器没有消耗touch事件,怎样才算没有被消耗呢,下面会讲到。
(2)onInterceptTouchEvent(): 在上诉方法内部调用,用来判断是否拦截某个事件,如果该方法返回ture 就代表下面的子布局就不会有执行onTouchEvent的机会了。需要强调的是View 中没有这个方法的实现
(3)onTouchEvent():在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件。
我们通过代码来看看:
<span style="white-space:pre"></span><pre name="code" class="java">public boolean diapatchTouchEvent(MotionEvent ev){ //最顶级父容器ViewGourpboolean consume = false; //默认的viewGourp返回值都是falseif(onInterceptTouchEvent(ev)){是否拦截这个事件consume = onTouchEvent(ev); 默认的View的onTouchEvent都会消费这个事件(返回true)}else{consume = child.dispatchTouchEvent(ev);若没有被拦截,则传递给他的孩子来管理这个事件 } return consume;}
上述伪代码已经说的很明显了。
分发事件的几个结论:
(1)同一个事件序列是从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以down事件开始,中间含有若干个move事件,最终已up事件结束。
(2)正常情况下,一个事件序列只能够被一个view拦截且消耗掉,但是可以通过特殊手段做到,比如一个View将本该自己处理的事件通过onTouchEvent强行传递给其他View处理
(3)ViewGourp默认不会拦截任何事件。
(4)View的onTouchEvent默认都会消耗事件(返回true),除非它是不可点击的(clickable和longClickable同时为false);
(5)View的enable属性不影响onTouchEvent的默认返回值。
(6)View一旦设置了点击监听器,super.onTouchEvent() 返回的则是true;
(7) View 如果设置了OnTouchListener,那么onTouchEvent就不会被调用了。
我刚开始看到这些的时候也是要记的觉得好多,但是想要学好,一定得知道。还有多看看源码,我懒得打源码去分析了。
就这样,有什么问题可以留言,一起讨论。哈哈!
- Android的事件分发机制 ---dispatcTouchEvent、onInterceptTouchEvent、onTouchEvent
- Android的事件分发onInterceptTouchEvent与onTouchEvent、OnClickListener、OnLongClick
- Android事件分发onInterceptTouchEvent与onTouchEvent
- android 事件分发 拦截 (onInterceptTouchEvent dispatchTouchEvent onTouchEvent)
- Android 事件分发onInterceptTouchEvent和onTouchEvent整理
- Android 事件分发(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- dispatchTouchEvent(),onInterceptTouchEvent()和onTouchEvent()的事件分发
- Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
- Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- android 事件分发 点击事件 ondispathTouchEvent onTouchEvent onInterceptTouchEvent
- 编程下 Touch 事件的分发和消费机制dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android onTouchEvent和onInterceptTouchEvent事件分发详解(一)
- Android onTouchEvent和onInterceptTouchEvent事件分发详解(二)
- Android onTouchEvent和onInterceptTouchEvent事件分发详解(三)
- android 事件分发,onInterceptTouchEvent()和onTouchEvent()总结,OnTouchListener。
- Android 触摸事件的分发与处理流程:onInterceptTouchEvent和onTouchEvent
- Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)
- 浅谈onInterceptTouchEvent、onTouchEvent与onTouch 事件的分发
- 【杭电-oj】-1236排名-(结构体应用)
- HRBUST-1909-理工门外的树
- HDU3336 Count the string KMP+递推
- MFC对话框添加菜单栏并添加鼠标单击响应
- 第五周上机实践项目——项目1-三角形类雏形-(5)
- Android的事件分发机制 ---dispatcTouchEvent、onInterceptTouchEvent、onTouchEvent
- PAT (Advanced Level) Practise 1099 Build A Binary Search Tree (30)
- C#第一次上机
- IOS 中block结构的简单用法
- 享元模式(FlyWeight)
- 集合第六发总结
- 将Qt、OpenGL、GLSL以及Qt的Graphics-View框架组合
- 自编码器Autoencoders
- github上常用的项目