| |
|
开发:
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) 一、触摸事件分析????????任何事物都有一个起点,触摸事件也是如此。当手指触摸手机的屏幕后发生什么呢?首先是由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、三个方法的关系
通过上面的伪码已经完全表示出它们的关系。 三、关于事件分发机制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的源码
????????第一步是判断事件如果是点击事件,则调用 onUserInteraction 方法,该方法的方法体为空,可以重写这个方法,用于处理一些交互问题。 ????????第二步是调用了 Window 的 superDispatchTouchEvent 方法,如果返回 true,则表示此事件已被消费,结束此次分发流程,false 则继续调用该 Activity 的 onTouchEvent 方法处理该事件。 如果感觉对您有意义,就给博主一些鼓励(点赞、关注、收藏),如果有错误欢迎大家评论。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |