IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 自学Android开发 View的事件分发机制 -> 正文阅读

[移动开发]自学Android开发 View的事件分发机制

目录

一、触摸事件分析

二、事件分发

1、dispathTouchEvent(MotionEvent event)

2、onInterceptouchEvent(MotionEvent ev)

3、onTouchEvent(MotionEvent event)

4、三个方法的关系

三、关于事件分发机制

四、activity中的事件分发


一、触摸事件分析

????????任何事物都有一个起点,触摸事件也是如此。当手指触摸手机的屏幕后发生什么呢?首先是由Linux内核调用触摸屏驱动,然后触摸屏驱动通知Android OS 的HAL层的相关Library,最后相关的Library会通知位于应用层的程序。

二、事件分发

????????事件分发就是对MotionEvent事件的分发过程,当一个MotionEvent事件产出后系统就需要把这个事件传递给一个具体的View,而这个传递的过程就是事件分发。分发过程由这几个方法完成:dispathTouchEvent、onInterceptouchEvent、onTouchEvent。

1、dispathTouchEvent(MotionEvent event)

????????用来进行事件的分发。如果事件能够传递给当前View,那它一定会会被调用,返回结果受当前View的onTouch和下一级的View的dispathTouchEvent方法的影响,表示是否消耗当前事件。

2、onInterceptouchEvent(MotionEvent ev)

????????在dispathTouchEvent方法内部调用,用来判断是否拦截某个事件,如果当前View拦截了某个,那在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件。

3、onTouchEvent(MotionEvent event)

????????也是在dispathTouchEvent方法内部调用,用来处理事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收事件。

4、三个方法的关系

//这个是伪码 不是源码
public boolean dispathTouchEvent(MotionEvent event){
  boolean result = false;
  if(onInterceptTouchEvent(event)){
      result = onTouchEvent(event);
  }else{
      result = child.dispathTouchEvent(event);
}
return result;
}

通过上面的伪码已经完全表示出它们的关系。

三、关于事件分发机制

1、同一个事件序列是指从DOWN事件开始,中间伴随着数个MOVE事件,最终以UP事件结束。

2、正常的情况下,一个事件序列只能被一个View拦截且消耗。因为一旦一个View拦截了某事件,那么同一个事件序列的内的所有事件都会交给它处理,因此同一个事件中的事件不能分发给两个View的同时处理。

3、某个View一旦拦截了,那么这一个事件序列只能由它处理,且它的onInterceptouchEvent不会调用了。

4、某个View一旦开始处理事件,如果它不消耗DOWN事件,那么同一个事件序列的其他事件都不会交给它了,并且事件将重新交给它的父元素去处理。

5、Viewgroup默认不拦截任何事件。

6、View没有onInterceptouchEvent方法。

7、View的onTouch默认否会消耗事件。

8、事件传递是由外向内的,事件总是先传递给父元素然后由父元素分发给子元素,通过requestDisallowInterceptTouchEvent分发可以在子元素中干预父元素的事件分发的过程,但是DOWN事件除外。

9、事件传递遵循:activity-> window->View。

四、activity中的事件分发

activity的dispatchTouchEvent的源码

publick boolean dispatchTouchEvent(event){
   if(event.getAction() == MotionEvent.ACTION_DOWN){
     onUserInteraction();
   }
   if(getWindow().superDispatchTouchEvent(event)){
      return true;
   }

return onTouchEvent(event);

}

????????第一步是判断事件如果是点击事件,则调用 onUserInteraction 方法,该方法的方法体为空,可以重写这个方法,用于处理一些交互问题。

????????第二步是调用了 Window 的 superDispatchTouchEvent 方法,如果返回 true,则表示此事件已被消费,结束此次分发流程,false 则继续调用该 Activity 的 onTouchEvent 方法处理该事件。

如果感觉对您有意义,就给博主一些鼓励(点赞、关注、收藏),如果有错误欢迎大家评论。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 21:50:06  更:2021-11-14 21:52:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:40:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码