Anroid Touch 事件传递机制
2016-06-25 16:44
260 查看
Android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:
1.public boolean dispatchTouchEvent(MotionEvent ev) 用来分发TouchEvent
2.public boolean onInterceptTouchEvent(MotionEvent ev) 用来拦截TouchEvent
3.public boolean onTouchEvent(MotionEvent ev) 用来处理TouchEvent
只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view,所以不用再向他的子视图分发,他也没有子视图,所以他是没有dispatch和intercept,只有touchEvent;
由中心区域处理touch事件:
首先触摸事件发生时(ACTION_DOWN),由系统调用Activity的dispatchTouchEvent方法,分发该事件,根据触摸事件的坐标,将此事件传递给out的dispatchTouchEvent处理,out则调用onInterceptTouchEvent判断事件是由自己处理,还是继续分发给子VIew。此处由于out不处理Touch事件,所以根据事件发生坐标,将事件传递给out的直接子View(即middle)。
middle及Center中事件处理过程同上,但是由于center组件是clickable表示其能处理touch事件,故Center中的onInterceptTouchEvent方法将事件传递给center自己的ontouchEvent方法处理,至此,此touch事件已被处理,不继续进行传递。
没有指定谁会处理touch事件:
事件处理流程大致相同,区别是所有组件都不会处理事件,事件并不会被center的
onTouchEvent方法“消费”,则事件会层层逆向传递回到Activity,若Activity也不对此事件进行处理,此事件相当于消失了(无效果)。
对于后续的move、up事件,由于第一个down事件已经确定由Activity处理事件,故up事有由Activity的dispatchTouchEvent直接分发给自己的onTouchEvent方法处理。
1) Touchevent 中,返回值是 true ,则说明消耗掉了这个事件,返回值是 false ,则没有消耗掉,会继续传递下去,这个是最基本的。
2) 事件传递的两种方式:
隧道方式:从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递。
冒泡方式:从最内层子元素依次往外传递直到根元素或在中间某一元素中由于某一条件停止传递。 android对Touch Event的分发逻辑是View从上层分发到下层(dispatchTouchEvent函数)类似于隧道方式,然后下层优先开始处理Event(先mOnTouchListener,再onTouchEvent)并向上返回处理情况(boolean值),若返回true,则上层不再处理。类似于冒泡方式
于是难题出现了,你若把Touch Event都想办法给传到上层了(只能通过返回false来传到上层),那么下层的各种子View就不能处理后续事件了。而有的时候我们需要在下层和上层都处理Touch事件
1.public boolean dispatchTouchEvent(MotionEvent ev) 用来分发TouchEvent
2.public boolean onInterceptTouchEvent(MotionEvent ev) 用来拦截TouchEvent
3.public boolean onTouchEvent(MotionEvent ev) 用来处理TouchEvent
只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view,所以不用再向他的子视图分发,他也没有子视图,所以他是没有dispatch和intercept,只有touchEvent;
由中心区域处理touch事件:
首先触摸事件发生时(ACTION_DOWN),由系统调用Activity的dispatchTouchEvent方法,分发该事件,根据触摸事件的坐标,将此事件传递给out的dispatchTouchEvent处理,out则调用onInterceptTouchEvent判断事件是由自己处理,还是继续分发给子VIew。此处由于out不处理Touch事件,所以根据事件发生坐标,将事件传递给out的直接子View(即middle)。
middle及Center中事件处理过程同上,但是由于center组件是clickable表示其能处理touch事件,故Center中的onInterceptTouchEvent方法将事件传递给center自己的ontouchEvent方法处理,至此,此touch事件已被处理,不继续进行传递。
没有指定谁会处理touch事件:
事件处理流程大致相同,区别是所有组件都不会处理事件,事件并不会被center的
onTouchEvent方法“消费”,则事件会层层逆向传递回到Activity,若Activity也不对此事件进行处理,此事件相当于消失了(无效果)。
对于后续的move、up事件,由于第一个down事件已经确定由Activity处理事件,故up事有由Activity的dispatchTouchEvent直接分发给自己的onTouchEvent方法处理。
1) Touchevent 中,返回值是 true ,则说明消耗掉了这个事件,返回值是 false ,则没有消耗掉,会继续传递下去,这个是最基本的。
2) 事件传递的两种方式:
隧道方式:从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递。
冒泡方式:从最内层子元素依次往外传递直到根元素或在中间某一元素中由于某一条件停止传递。 android对Touch Event的分发逻辑是View从上层分发到下层(dispatchTouchEvent函数)类似于隧道方式,然后下层优先开始处理Event(先mOnTouchListener,再onTouchEvent)并向上返回处理情况(boolean值),若返回true,则上层不再处理。类似于冒泡方式
于是难题出现了,你若把Touch Event都想办法给传到上层了(只能通过返回false来传到上层),那么下层的各种子View就不能处理后续事件了。而有的时候我们需要在下层和上层都处理Touch事件
相关文章推荐
- JavaScript学习笔记十一:高阶函数-map/reduce
- Twitter分布式自增ID算法Snowflake
- 自定义加载等待动画,仿金山词霸
- java基础(三)方法/数组/堆栈/
- WebSocket
- vim设置文本宽度
- sqlite3的图片的(二进制数据)存取操作
- Caused by: java.lang.ClassNotFoundException: Didn't find class "net.oschina.app.AppContext" on path:
- 演练:使用 Visual C# 从 Windows 窗体控件继承
- 线性代数个人系统总结(摘抄,来源多,侵删)
- 焦点图的实现
- 面向对象的特征有哪些方面
- 网站后端.Flask.实战-社交博客开发-认证实现?
- FPGA与simulink联合实时环路系列——实验一 测试
- 秒杀系统
- MySQL入门操作
- 多线程同步方法
- C语言之变量的本质
- Oracle存储过程循环语法实例分析
- 错误处理页例子