android事件传递机制的浅谈
来源:互联网 发布:国家进出口数据 编辑:程序博客网 时间:2024/06/10 20:07
想必大家有时会遇到需要自定义控件吧,这个时候就会遇到事件的传递和处理了,非常繁琐啊!百度上面一大票关于事件的传递机制,但是都千篇一律,都是dispatchTouchEvent
返回true,则事件被拦截,false则分发给子控件之类的,经过几天的研究发现这个事件传递并没有说的这么简单也没有想象中的难。
一般的点击事件、滑动事件都是用ACTION_DOWN、ACTION_MOVE、ACTION_UP组成的,android应用里面默认情况下,触摸事件是从activity开始传递,假设里面的view都不需要拦截事件,那么这个触摸事件会沿着里面的视图走一圈再回到activity,如果我们对某一个view绑定了一个事件监听器,那么这个事件只能被一个view消费。
注意:默认系统事件机制,一但ACTION_DOWN没有被一个ViewGroup或者View消费(即dispatchTouchEvent 返回为false),那么以后的ACTION_MOVE、ACTION_UP事件就再也不会分发到这个ViewGroup或者View上了(即该ViewGroup或者View再也不会调用dispatchTouchEvent 这个方法了)
其实以上说的大家一般都清楚,但是当需要重写某个控件的时候又会犯难了,因为光知道以上的还不够,这个时候我们需要去看源码研究下,通过俺的鼓捣,发现了事件传递的规律:
假设activity中有一个ViewGroup,ViewGroup又有一个子View,下面写下事件传递顺序:
1、当事件没有被任何view消费的
dispatchTouchEvent(Activity) →事件传递给Window→ dispatchTouchEvent (ViewGroup)→
onInterceptTouchEvent(ViewGourp)→ dispatchTouchEvent (View)→onTouchEvent(View)
→ onTouchEvent(ViewGroup)→ onTouchEvent(Activity)
2、当事件被ViewGroup消费,不传递给子View,onInterceptTouchEvent(ViewGourp)返回true
dispatchTouchEvent(Activity) →事件传递给Window→ dispatchTouchEvent (ViewGroup)→
onInterceptTouchEvent(ViewGourp) → onTouchEvent(ViewGroup)
3、当事件被子View消费,onInterceptTouchEvent(ViewGourp)返回falsedispatchTouchEvent(Activity) →事件传递给Window→ dispatchTouchEvent (ViewGroup)→
onInterceptTouchEvent(ViewGourp) → dispatchTouchEvent (View)→onTouchEvent(View)
其实一个触摸事件不管是activity还是viewgroup、view,都是从dispatchTouchEvent这个回调函数开始,里面会把触摸事件传给它的下一层,如果他的下一层dispatchTouchEvent返回了ture,则这个事件就回不去了,因为被下一层拦截到了,onTouchEvent方法只是在dispatchTouchEvent中最后调用的,因为会先把事件传递给下一层,如果下一层不要了才会执行到调用onTouchEvent这一步,而onInterceptTouchEvent只有viewgroup中才有,是对事件的再一次拦截。
这个是系统默认方式,但是如果重写上面的dispatchTouchEvent方法,就可以颠覆这个默认的规律,比如viewgroup传递给它的子view,我在他们的相关事件拦截方法里面都返回false,然后对他们都各自处理自己的事件,那么这样就不是一个事件只能被一个视图消费了,暂时就水到这,这只是自己的一点心得,欢迎大家互相学习交流
转载请注明本文出自Alex老夫子的博客(http://blog.csdn.net/msn465780),谢谢支持!
- android事件传递机制的浅谈
- 浅谈Android自定义View事件传递机制
- Android的事件传递机制
- Android事件的传递机制
- Android 事件的传递机制
- Android 事件的传递机制
- Android事件的传递机制
- Android的事件传递机制
- android的事件传递机制
- Android的事件传递机制
- Android的事件传递机制
- Android的事件传递机制
- 浅谈Android事件分发机制(一)点击事件的传递规则
- 浅谈View事件传递机制
- android 事件传递机制
- android 事件传递机制
- android事件传递机制
- Android事件传递机制
- dex文件结构分析-3
- linux查看用户命令
- 安装xmind出错:没有JRE
- LeetCode223——Rectangle Area
- 传入时间与现在时间的差距及其表示
- android事件传递机制的浅谈
- 高效学习有方法--自己的感悟
- Snail—UI学习之表视图TableView多行删除
- linux更换硬盘后的网络设置
- oc不可变字符串和可变字符串相关操作
- UL下拉列表 调出滑动条
- 随笔
- C++学习笔记——运算符重载
- HDOJ 1789 Doing Homework again(贪心,好题)