Atitit View事件分发机制
来源:互联网 发布:linux shell cut 编辑:程序博客网 时间:2024/06/05 02:07
1. AtititView事件分发机制
1.Atitit View事件分发机制1
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
1.2.事件分发具体流程2
事件分发机制就是弄清楚三个方法,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
简称:: EmirAttilax Akbar 埃米尔 阿提拉克斯 阿克巴
全名::EmirAttilax Akbar binMahmud bin attila binSolomon Al Rapanui
埃米尔阿提拉克斯 阿克巴 本马哈茂德 本 阿提拉本 所罗门 阿尔 拉帕努伊
常用名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源:attilax的专栏 http://blog.csdn.net/attilax
--Atiend
- Atitit View事件分发机制
- view 事件分发机制
- View 事件分发机制
- View事件分发机制
- view事件分发机制
- View事件分发机制
- view事件分发机制
- view事件分发机制
- view事件分发机制
- View事件分发机制
- View 事件分发机制
- View事件分发机制
- View事件分发机制
- view 事件分发机制
- View事件分发机制
- View事件分发机制
- View事件分发机制
- view 事件分发机制
- 线程通信(生产者消费者问题)、wait()与notify()方法详解
- 约瑟夫生死问题递归算法
- 二维线段树(Mosaic,hdu 4819)
- java的锁机制
- 微信订阅号和服务号再探究竟
- Atitit View事件分发机制
- Android实现计时与倒计时(限时抢购)的几种方法
- Qt之进程间通信(共享内存)
- 有关 poi 读 excel 中的一些问题
- 合并文档时让第一页为奇数
- div设置float后下一个div要换行的解决办法
- POJ 3414 Pots
- 切换具有SYSTEM权限的控制台或桌面
- ZCMU—1132