Atitit View事件分发机制
1. Atitit View事件分发机制
1.1. 三个关键方法 dispatchTouchEvent onInterceptTouchEvent onTouchEvent1
1.1.1. public boolean dispatchTouchEvent(MotionEvent ev)1
1.1.2. public boolean onInterceptTouchEvent(MotionEvent ev)1
1.1.3. public boolean onTouchEvent(MotionEvent event)1
事件分发机制就是弄清楚三个方法,dispatchTouchEvent(),OnInterceptTouchEvent(),onTouchEvent(),和这三个方法与n个ViewGroup和View堆叠在一起的问题,再复杂的结构都能拆分成1个ViewGroup+1个View。
其实ViewGroup和View都是大同小异,View只是没有了子容器,自然不存在拦截问题,dispatch也很简单,所以弄明白了ViewGroup其实就懂的差不多了
方法与控件的对应关系如下表所示:
Touch 事件相关方法 |
方法功能 |
ViewGroup |
Activity |
public boolean dispatchTouchEvent(MotionEvent ev) |
事件分发 |
Yes |
Yes |
public boolean onInterceptTouchEvent(MotionEvent ev) |
事件拦截 |
Yes |
No |
public boolean onTouchEvent(MotionEvent ev) |
事件响应 |
Yes |
Yes |
1.1. 三个关键方法 dispatchTouchEvent onInterceptTouchEvent onTouchEvent
1.1.1. public boolean dispatchTouchEvent(MotionEvent ev)
View/ViewGroup处理事件分发的发起者,View/ViewGroup接收到触控事件最先调起的就是这个方法,然后在该方法中判断是否处理拦截或是将事件分发给子容器
1.1.2. public boolean onInterceptTouchEvent(MotionEvent ev)
ViewGroup专用,通过该方法可以达到控件事件的分发方向,一般可以在该方法中判断将事件给ViewGroup独吞或是它继续传递给子容器,是处理事件冲突的最佳地点
1.1.3. public boolean onTouchEvent(MotionEvent event)
触控事件的真正处理者,最后每个事件都会在这里被处理
1.2. 事件分发具体流程
MotionEvent ev;//down or move or up or others...
viewgroup.dispatchTouchEvent(ev);
public boolean dispatchTouchEvent(MotionEvent ev){
boolean isConsumed = false;
if(onInterceptTouchEvent(ev)){
isCousumed = this.onTouchEvent(ev);
}else{
isConsumed = childView.dispatchTouchEvent(ev);
}
return isConsumed;
}
返回结果true表示事件被处理了,返回false表示没有处理。同一个层次中一般最多只有一个容器能够返回true(当然不排除用黑科技咯,有些大神在写牛逼开源控件的时候都会劫持掉MotionEvent来处理滑动效果和冲突等)。
上面的代码通俗易懂,看起来也很简单,一句话就能概括,ViewGroup收到事件后调用dispatch,在dispatch中先检查是否要拦截,若拦截则ViewGroup吃掉事件,否则交给有处理能力的子容器处理。
1.3. 继续来扩展我们的伪代码,
拦截条件判断完之后,决定把事件继续传递给子View的时候,会调用childView.dispatchTouchEvent(ev)
伪代码说完了,ViewGroup的事件传递规则也就差不多说完了,这么看是不是很简单了。View相对于VIewGroup来说就更简单了,没有拦截方法,dispatch基本上是直接调用了自身的onTouchEvent,处理起来一点难度都木有呀
1.4. 设计模式的话,会很快想到观察者模式,例子中的事件分发器正式使用了此模式。
十分钟彻底弄明白View事件分发机制 - 推酷.htm
实例:事件分发器_JavaScript编程学院_IT学院.htm
Android 编程下 Touch 事件的分发和消费机制 - sunzn - 博客园.htm
作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher
捕鸟王"Bird Catcher 王中之王King of Kings 虔诚者Pious 宗教信仰捍卫者 Defender of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak
简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴
全名::Emir Attilax Akbar bin Mahmud bin attila bin Solomon Al Rapanui
埃米尔 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门 阿尔 拉帕努伊
常用名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源:attilax的专栏 http://www.cnblogs.com/attilax/
--Atiend
相关文章
- spring的事件监听应用场景_java监听器的原理与实现
- 深入理解Spring事件机制(二):事件的推送[通俗易懂]
- 失去焦点和获得焦点发生事件(js)
- js事件循环机制和优先级
- 深入分析 Watcher 机制的实现原理(三)客户端接收服务端处理完成的响应及事件触发
- JavaScript——DOM事件高级
- 深入理解Spring的事件通知机制
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
- 【Java AWT 图形界面编程】事件处理机制 ③ ( AWT 中常见的事件和事件监听器 | 低级事件 | 组件事件 | 窗口事件 | 鼠标事件 | 高级事件 | 动作事件 | 事件监听器 )
- Eureka的事件通知机制(一)
- Eureka的事件通知机制(二)
- js 全局键盘事件
- Oracle 等待事件 cleanup of aborted process 官方解释,作用,如何使用及优化方法
- Oracle 等待事件 free buffer waits 官方解释,作用,如何使用及优化方法
- 引力波再立大功!人类首次确认黑洞-中子星合并事件
- 深入了解Linux的UEVENT事件机制(linuxuevent)
- MySQL事件自动启动机制简介(mysql 事件启动)
- Oracle事件管理改善系统可用性(oracle事件管理)
- Oracle事件机制强大的定时触发功能(oracle事件机制)
- Redis集群事件实时通知机制(redis集群事件通知)
- 初窥JQuery(二)事件机制(1)
- 关于jQuery新的事件绑定机制on()的使用技巧
- javascript使用onclick事件改变选中行的颜色
- js阻止事件追加的具体实现