Android中的事件分发机制
2024-08-29 05:06:33
Android中的事件分发机制
作者:丁明祥
邮箱:2780087178@qq.com
这篇文章这周之内尽量写完
参考资料:
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
1.Android onTouch()事件处理分发中的三个重要方法:
dispatchTouchEvent()
onInterceptTouchEvent()
onTouchEvent()
2.onTouch()
事件
onTouch事件包括一个ACTION_DOWN,若干个ACTION_MOVE和一个ACTION_UP等的一系列事件组合。
3.onTouch()
函数返回值有什么用
如果我们将返回值改成true,则onTouch()
会处理并截获该事件。(截获的意思是指如果我们同时监听onTouch()
,和onClick()
,而onTouch()
截获了该事件,则onClick()
将不会被触发)。
4.上面的三个重要方法详细说明
dispatchTouchEvent()
处理触摸事件分发,当onTouch()
被触发时默认调用该事件,``onInterceptTouchEvent()
中断事件继续分发,在
dispatchTouchEvent()`中选择调用
onTouchEvent()
接受到事件之后负责处理
View里,有两个回调函数 :
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
ViewGroup里,有三个回调函数 :
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onInterceptTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
在Activity里,有两个回调函数 :
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
5.看一下dispatchTouchEvent()
的源码`
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
//onTouch()函数的返回值决定了是直接返回还是调用onTouchEvent进行处理
return true;
}
return onTouchEvent(event);
}
6.onTouchEvent()
源码太长了,懒得看,只贴一点重要的东西
public boolean onTouchEvent(MotionEvent event) {
final int viewFlags = mViewFlags;
if ((viewFlags & ENABLED_MASK) == DISABLED) {
return (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
}
if (mTouchDelegate != null) {
if (mTouchDelegate.onTouchEvent(event)) {
return true;
}
}
if (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
//switch里面就是onTouch()触发的四个事件
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
...
case MotionEvent.ACTION_DOWN:
...
case MotionEvent.ACTION_CANCEL:
...
case MotionEvent.ACTION_MOVE:
...
}
return true;
}
return false;
}
7.一个简单的问题
最新文章
- pip install 安装python-requests
- sql server2008 r2 密钥
- android NDK debug 遇到的问题与解决方法
- asp.net实现动态添加table行
- Python编码/文件读取/多线程
- [转]30分钟学会反向Ajax
- Java从入门到精通——数据库篇Oracle 11g服务详解
- ArryList vs LinkedList
- ActionBar官方教程(9)ActionBar的顶部tab模式(注意,已经被弃用)
- mysql 学习(1)
- BZOJ1679: [Usaco2005 Jan]Moo Volume 牛的呼声
- C# 经典入门12章-使用泛型-1
- IOS学习5——属性与成员变量
- DedeCMS V5.7开启memcache缓存的方法配置说明
- ●BZOJ 1069 [SCOI2007]最大土地面积
- 面向对象_classmethod_staticmethod
- html 的 crossorigin 属性
- websocket的属性readyState
- Docker镜像仓库Harbor搭建及配置
- git 管理和存储二进制大文件
热门文章
- Solid Angle of A Cubemap Texel - 计算Cubemap的一个像素对应的立体角的大小
- promise待看文档备份
- Surrogate data 代理数据
- 文字纵向滚动marquee
- Maven安装+配置
- 【数据分析学习】016-numpy数据结构
- UML类图解析
- 报错The jarsigner could not be found. Make sure to run with the build with a JDK。的解决方法
- [luogu2680] 运输计划 (lca+二分+树上差分)
- 02022_System类的方法练习