博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android ontouch事件分发机制
阅读量:5122 次
发布时间:2019-06-13

本文共 1084 字,大约阅读时间需要 3 分钟。

最近开发一个项目中,banner图左右切换和下拉刷新手势有冲突,为此去研究了事件分发,网上资料一大抄,有些讲的不对有些讲的不全,结合了网上一些博文以及源码总结如下

 一个完整的触摸事件包含down,move(一个或多个),up或cancel三个阶段,触摸手势是一个事件系列,以1个down事件开始,接下去是0个或多个move事件,最后以up或者cancel结束;
    1、涉及到事件分发的方法主要有 view类下的DispatchTouchEvent(事件分发)和OnTouchEvent(事件响应)以及Group下的onInterceptTouchEvent(事件拦截)
    2、DispatchTouchEvent会将事件从根节点层层下发直到某个结点的OnTouchEvent消费了此事件或者所有结点处理完成
    3、onInterceptTouchEvent方法只有在ViewGroup才存在,在DispatchTouchEvent内部调用,方法返回值决定此事件是否被当前Viewgroup拦截;如果返回值为true,则事件被拦截,该事件不会下发给子控件,此事件会交由当前viewgroup对应的OnTouchEvent处理,后续事件不会再触发onInterceptTouchEvent,直接交由OnTouchEvent处理;如果返回false且当前viewgroup不是最终的控件,后续的事件还是会触发onInterceptTouchEvent
    4、OnTouchEvent返回值表示当前控件是否消费了当前事件,如果down事件返回true,后续事件都会触发OnTouchEvent(就算move事件返回false);如果down事件返回false,后续事件再也不会传给此控件
    5、setOnTouchListener为用户自定义事件回调方法,它会在OnTouchEvent之前执行,如果方法返回true表示自定义回调方法消费了事件,OnTouchEvent将不会执行
    6、当一整条事件链的OnTouchEvent方法都返回false,事件则会由子控件向父控件逐级上发,直到某个父容器OnTouchEvent方法返回true或者全部上发完毕
    7、一旦确认某个控件OnTouchEvent返回true,后续事件传递过来时候不会触发onInterceptTouchEvent
    8、当某个down事件被子view消费,但后续某个move事件被viewgroup拦截

 

转载于:https://www.cnblogs.com/xiongweidotnet/p/5897309.html

你可能感兴趣的文章
Djang 用户登录
查看>>
Java同步锁——lock与synchronized 的区别【转】
查看>>
洛谷-校门外的树-数组
查看>>
Python--网络编程-----文件传输简单版本
查看>>
CF 208E. Blood Cousins [dsu on tree 倍增]
查看>>
趣谈面试(一)
查看>>
Quart2D setNeedsDisplay
查看>>
设计模式之策略设计模式
查看>>
Sql server 从一个表中获取数据更新到另一个表中
查看>>
JS继承的实现方式 原型 原型链 prototype和_proto_的区别
查看>>
[bzoj3622] 已经没有什么好害怕的了
查看>>
Objective-c 中 nil, Nil, NULL和NSNull的区别
查看>>
解决Ubuntu编译内核uImage出现问题“mkimage” command not found - U-Boot
查看>>
NOIP2018退役记
查看>>
第三次作业-功能测试
查看>>
(C++)浅谈using namespace std
查看>>
Http协议与生命周期
查看>>
Filter过滤器
查看>>
HTML5新标签在低版本浏览器中兼容性Checklist (hacks and issues)
查看>>
Laravel框架使用的一些注意细节(一)
查看>>