View事件分发机制分析
2016-03-11 11:27
239 查看
谈到View事件分发,相信大家都不陌生,我也自己琢磨了一下事件分发机制,从源码分析,提取了关键的步骤,并做小小的总结。
主要相关的类与方法为:
ViewGroup:
dispatchTouchEvent()
onInterceptTouchEvent()
onTouchEvent()
View:
dispatchTouchEvent()
onTouchEvent()
整体的思想可以概括为:
先看整体流程图:
![](https://img-blog.csdn.net/20160311112145601)
修正补充@2016年6月27日:
经@wangmengdeboke 的指出,左下角部分的图需要做点改动,如下图所示:
![](https://img-blog.csdn.net/20160627224410011)
正如补充的,这个disable状态也是蛮重要的,非常感谢@wangmengdeboke的指正。
activity事件分发
在图的左上角,是activity的事件分发,实际是调用DecorView的dispatchTouchEvent来进行的,而DecorView是继承自FrameLayout的类,其实算是最外层的viewGroup,当事件传递到viewGroup,就进入到右边分支判断。
ViewGroup的事件分发
一般情况下,如果不对onInterceptTouchEvent与disallowIntercept进行处理,就会对viewGroup中的childView进行处理,所以这里可以通过人为干预达到拦截事件分发的效果,但值得注意的是不能够拦截down事件,因为一旦拦截,则在onInterceptTouchEvent中不会接收到up与move事件,即这些事件直接被该viewGroup处理了。
View的事件分发
当事件分发到view后,会按序执行onTouch,onTouchEvent,onClick【如果有的话】,一旦有一者返回true消耗掉事件,则后者都不会响应,这里的onTouchEvent,适合做相关的事件处理与执行工作。
总结:
每个手指的动作,都会触发down,up,move的操作,并引发一系列的事件分发,而且一旦拦截掉down,则所有的事件也会交由该控件处理。在自定义viewGroup与View中,我们可以在onTouchEvent里面对相关的手指动作做处理,而在ViewGroup中,可以根据需要在onInterceptTouchEvent拦截该拦截需要拦截的事件。在View中,也可以修改父容器disallowInterceptTouchEvent的值达到控制父容器事件分发的目的,不过需要注意的是,down事件一定注意不要被父容器拦截到。
主要相关的类与方法为:
ViewGroup:
dispatchTouchEvent()
onInterceptTouchEvent()
onTouchEvent()
View:
dispatchTouchEvent()
onTouchEvent()
整体的思想可以概括为:
public boolean dispatchTouchEvent(){ boolean consume = false; if(onInterceptTouchEvent()){ cousume = onTouchEvent(); }else{ consume = child.dispatchTouchEvent(); } return consume; }
先看整体流程图:
修正补充@2016年6月27日:
经@wangmengdeboke 的指出,左下角部分的图需要做点改动,如下图所示:
正如补充的,这个disable状态也是蛮重要的,非常感谢@wangmengdeboke的指正。
activity事件分发
在图的左上角,是activity的事件分发,实际是调用DecorView的dispatchTouchEvent来进行的,而DecorView是继承自FrameLayout的类,其实算是最外层的viewGroup,当事件传递到viewGroup,就进入到右边分支判断。
ViewGroup的事件分发
一般情况下,如果不对onInterceptTouchEvent与disallowIntercept进行处理,就会对viewGroup中的childView进行处理,所以这里可以通过人为干预达到拦截事件分发的效果,但值得注意的是不能够拦截down事件,因为一旦拦截,则在onInterceptTouchEvent中不会接收到up与move事件,即这些事件直接被该viewGroup处理了。
View的事件分发
当事件分发到view后,会按序执行onTouch,onTouchEvent,onClick【如果有的话】,一旦有一者返回true消耗掉事件,则后者都不会响应,这里的onTouchEvent,适合做相关的事件处理与执行工作。
总结:
每个手指的动作,都会触发down,up,move的操作,并引发一系列的事件分发,而且一旦拦截掉down,则所有的事件也会交由该控件处理。在自定义viewGroup与View中,我们可以在onTouchEvent里面对相关的手指动作做处理,而在ViewGroup中,可以根据需要在onInterceptTouchEvent拦截该拦截需要拦截的事件。在View中,也可以修改父容器disallowInterceptTouchEvent的值达到控制父容器事件分发的目的,不过需要注意的是,down事件一定注意不要被父容器拦截到。
相关文章推荐
- Android自定义View过程解析
- Android自定义View软键盘实现搜索
- codeigniter中view通过循环显示数组数据的方法
- MVVM模式中ViewModel和View、Model有什么区别?
- Android重写View并自定义属性实例分析
- android开发教程之view组件添加边框示例
- Android动态添加View的问题解决方法
- Android viewpager中动态添加view并实现伪无限循环的方法
- Android自定义View之酷炫圆环(二)
- android获得当前view在屏幕中坐标的方法
- 4种Android获取View宽高的方式
- Android获取屏幕或View宽度和高度的方法
- Android中将View的内容保存为图像的简单实例
- Android View移动的六种方法小结
- Android View添加 Listener 实例代码
- Android编程之View简单学习示例
- Android View事件机制 21问21答
- Android判断touch事件点是否在view范围内的方法
- Android中SurfaceView和view画出触摸轨迹
- Android中Window添加View的底层原理