| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android笔记---事件分发和冲突解决 -> 正文阅读 |
|
[移动开发]Android笔记---事件分发和冲突解决 |
一、事件分发简介1. View 触摸事件对于屏幕的点击,滑动,抬起等一系的动作,其实都是由一个一个MotionEvent对象组成的。根据不同动作,主要有以下三种事件类型: (1)ACTION_DOWN:手指刚接触屏幕,按下去的那一瞬间产生该事件
ACTION_CANCEL 一般是指 ChildView 原先拥有事件处理权,后面由于某些原因,该处理权需要交回给上层去处理,ChildView便会收到ACTION_CANCEL事件。对于一些复位或者重置操作,我们应该在 ACTION_UP 和 ACTION_CANCEL 里面同时进行处理。 代码逻辑上是:上层判断之前交给ChildView的事件处理权需要收回来了,便会做事件的拦截处理,拦截时给ChildView发一个ACTION_CANCEL事件。 2. 主要方法View 的事件分发机制主要涉及到以下几个方法:
3.图解事件处理流程
。 当触摸事件发生时,首先 Activity 将 TouchEvent 传递给最顶层的 View,TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true 消费事件,事件终结。如果dispatchTouchEvent返回 false ,则回传给父View的onTouchEvent事件处理;如果dispatchTouchEvent返回super的话,默认会调用自己的onInterceptTouchEvent方法。
二、事件冲突解决在开发当中,View 的滑动冲突时经常遇到的,比如 ViewPager 嵌套 ViewPager、ScrollView 嵌套 ViewPager、ViewPager嵌套RecyclerView和ScrollView嵌套RecyclerView等等,下面让我们一起来看看怎么解决。 1.常见的冲突情况(1)第一种情况,滑动方向不同 (2)第二种情况,滑动方向相同 (3)第三种情况,上述两种情况的多级嵌套 2.如何解决看了上面三种情况,我们知道他们的共同特点是父View 和子View都想争着响应我们的触摸事件,但遗憾的是我们的触摸事件同一时刻只能被某一个View或者ViewGroup拦截消费,所以就产生了滑动冲突。那既然同一时刻只能由某一个 View 或者 ViewGroup 消费拦截,那我们就只需要决定在某个时刻由这个 View 或者 ViewGroup 拦截事件,另外的 某个时刻由 另外一个 View 或者 ViewGroup 拦截事件,不就 OK了吗? 这里针对第一种冲突情况介绍一下解决方法: (1)第一种解决方法 从父View着手,重写onInterceptTouchEvent方法,在父View需要拦截的时候拦截,不要的时候返回false,代码大概如下
(2)第二种解决方法 从子View着手,父View先不要拦截任何事件,所有的事件传递给 子View,如果子View需要此事件就消费掉,不需要此事件的话就交给 父View处理。实现思路 如下,重写子 View的dispatchTouchEvent方法,在ACTION_DOWN动作中通过方法 requestDisallowInterceptTouchEvent(true) 先请求 父 View不要拦截事件,这样保证子 View 能够接受到ACTION_MOVE事件,再在ACTION_MOVE动作中根据自己的逻辑是否要拦截事件,不需要拦截事件的话再交给 父 View 处理。
(3)项目中遇到滑动冲突的解决方法 如下面这张设计图,想要的效果是两个页面来回切换,页面的Item可以侧滑拉出删除按钮,这里的布局是由ViewPager+Fragment+RecyclerView设计的,但是做出来的效果,Recyclerview侧滑和ViewPager侧滑会产生冲突,导致RecyclerView的Item侧滑卡顿甚至滑不出来。 这种情况的解决思路可以从内部子View即RecyclerView入手,首先判断是否在RecyclerView中进行滑动,在判断删除按钮是否已经滑出,进而将滑动事件交由父ViewGroup处理。 主要解决代码如下:
参考: |
|
移动开发 最新文章 |
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图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/12 1:52:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |