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.一个简单的问题

最新文章

  1. pip install 安装python-requests
  2. sql server2008 r2 密钥
  3. android NDK debug 遇到的问题与解决方法
  4. asp.net实现动态添加table行
  5. Python编码/文件读取/多线程
  6. [转]30分钟学会反向Ajax
  7. Java从入门到精通——数据库篇Oracle 11g服务详解
  8. ArryList vs LinkedList
  9. ActionBar官方教程(9)ActionBar的顶部tab模式(注意,已经被弃用)
  10. mysql 学习(1)
  11. BZOJ1679: [Usaco2005 Jan]Moo Volume 牛的呼声
  12. C# 经典入门12章-使用泛型-1
  13. IOS学习5——属性与成员变量
  14. DedeCMS V5.7开启memcache缓存的方法配置说明
  15. ●BZOJ 1069 [SCOI2007]最大土地面积
  16. 面向对象_classmethod_staticmethod
  17. html 的 crossorigin 属性
  18. websocket的属性readyState
  19. Docker镜像仓库Harbor搭建及配置
  20. git 管理和存储二进制大文件

热门文章

  1. Solid Angle of A Cubemap Texel - 计算Cubemap的一个像素对应的立体角的大小
  2. promise待看文档备份
  3. Surrogate data 代理数据
  4. 文字纵向滚动marquee
  5. Maven安装+配置
  6. 【数据分析学习】016-numpy数据结构
  7. UML类图解析
  8. 报错The jarsigner could not be found. Make sure to run with the build with a JDK。的解决方法
  9. [luogu2680] 运输计划 (lca+二分+树上差分)
  10. 02022_System类的方法练习