当前位置: 首页 > news >正文

View中的滑动冲突

View中的滑动冲突

1.滑动冲突的种类

滑动冲突一般有3种,

第一种是ViewGroup和子View的滑动方向不一致

比如:

父布局是可以左右滑动,子view可以上下滑动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N6eB72R3-1684684859481)(../../assets/流程图-导出 (2)].png)


第二种

ViewGroup和子View的滑动方向一致

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ar0cm7gM-1684684859482)(../../assets/流程图-导出 (3)].png)

第三种

第三种类似于如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxWMQGRA-1684684859483)(../../assets/流程图-导出 (4)].png)

2.滑动冲突的解决方式

滑动冲突一般情况下有2种解决方法

1.外部拦截法

2.内部拦截法

这两个的区别是:外部拦截法是先经过父容器的拦截处理,如果父容器拦截的话,则拦截。不拦截则交给view。

而内部拦截法一般情况下是父容器不进行拦截,直接由子容器进行判断拦不拦截。

3.分析

这里分析就只分析第一种滑动冲突和第二种滑动冲突,第三种就是把1,2结合起来

3.1第一种滑动冲突

先讲外部拦截法

3.1.1外部拦截法

在ViewGroup里面重写onInterceptTouchEvent()

ACTION_DOWN中先判断ViewGroup是否滑动,如果滑动的话,则直接拦截

intercepted = true;

没有滑动的话,不进行拦截

intercepted = false;

这块的完整代码

case MotionEvent.ACTION_DOWN:{intercepted = false;if(!mScroller.isFinished()){mScroller.abortAnimation();intercepted = true;}
}

**mScroller.abortAnimation();**中止动画

因为如果用户现在在水平滑动,在动画结束前就竖直滑动。不加上面那句代码会导致界面停在中间状态


然后在ACTION_MOVE中进行判断

判断竖着滑动的长度长还是横着滑动的滑动长

图中是ViewGroup左右滑动view上下滑动

如果左右滑动的长度>上下滑动的长度,则直接拦截;否则ViewGroup不进行拦截

int deltax = x - lastX;
int deltay = y - lastY;
if(Math.abs(deltax)>Math.abs(deltay)){intercepted = true;
}
else{intercepted = false;
}

然后ACTION_UP

case MotionEvent.ACTION_UP:{intercepted = false;break;
}

这里必须为false,因为ACTION_UP本身没多大意义

3.2.1内部拦截

内部拦截是子view重写dispatchTouchEvent()

并配合**requestDisallowInterceptedTouchEvent()**方法

ACTION_DOWN

mHorizontalScrollViewEx2.requestDisallowInterceptTouchEvent(true);

这个mHorizontalScrollViewEx2是那个自定义ViewGroup

这里就是ViewGroup不进行拦截


ACTION_MOVE

int deltax = x - lastX;
int deltay = y - lastY;
if(Math.abs(deltax)>Math.abs(deltay)){mHorizontalScrollViewEx2.requestDisallowInterceptTouchEvent(false);
}

如果左右滑动的长度大于上下滑动的长度,则ViewGroup进行拦截

ACTION_UP

直接

break;

最后在

return super.dispatchTouchEvent(event);

其实已经结束了,但是我们为了优化性能

自定义的ViewGroup中进行如下操作

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {int action = ev.getAction();if(action == MotionEvent.ACTION_DOWN){if(!mScroller.isFinished()){mScroller.abortAnimation();intercepted = true;}return false;}else{return true;}
}

我对else那块的理解是

如果ViewGroup开始判断action == MotionEvent.ACTION_MOVE或者ACTION_UP

那就说明action肯定拦截了MotionEvent.ACTION_DOWN,这样的话。那么其他的行为它肯定也会拦截

在不重写其他方法的情况下:

不存在一个ViewGroup拦截同一个事件的ACTION_DOWN,而它的子View拦截同一个事件的ACTION_MOVE/ACTION_UP

也不存在一个子View拦截同一个事件的ACTION_DOWN,而它的ViewGroup拦截同一个事件的ACTION_MOVE/ACTION_UP

3.2第二种滑动冲突

这个得你自己定义

假设我的ViewGroup子View都是上下滑动

我的ViewGroup和子View定的规矩是子View滑到底才由ViewGroup进行拦截,其他都是子View拦截

先看看外部拦截法:

3.2.1外部拦截法

大致思路就是在重写ViewGrouponInterceptTouchEvent是进行判断

如果上下滑动的距离超过了子View的长度,则onIntercept = true,其他情况下都为false

private float startY;
private View innerView;
@Override
protected void onFinishInflate() {super.onFinishInflate();// 获取内部ViewinnerView = getChildAt(0);
}@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:startY = ev.getY();// 不拦截,由内部View处理return false;case MotionEvent.ACTION_MOVE:float currentY = ev.getY();float deltaY = currentY - startY;startY = currentY;// 内部View滑动到顶部且向上滑动,或内部View滑动到底部且向下滑动时拦截事件if ((innerView.canScrollVertically(-1) && deltaY > 0) ||(innerView.canScrollVertically(1) && deltaY < 0)) {// 拦截事件,由外部ViewGroup处理return true;}break;}// 不拦截,由内部View处理return false;
}

3.2.2内部拦截法

在重写子View的**dispatchTouchEvent()**的时候,和上面差不多,也是进行判断

@Override
public boolean dispatchTouchEvent(MotionEvent event) {if (滑动到底部的条件) {return false; // 不拦截事件,交给父容器处理} else {return super.dispatchTouchEvent(event); // 继续传递给子View处理}
} 

3.3第三种滑动冲突

第三种滑动冲突的解决方法就是结合第一和第二两个就行了

相关文章:

View中的滑动冲突

View中的滑动冲突 1.滑动冲突的种类 滑动冲突一般有3种, 第一种是ViewGroup和子View的滑动方向不一致 比如: 父布局是可以左右滑动,子view可以上下滑动 第二种 ViewGroup和子View的滑动方向一致 第三种 第三种类似于如下图 2.滑动冲突的解决方式 滑动冲突一般情况下有2…...

java boot项目基础配置之banner与日志配置演示 并教会你如何使用文档查看配置

上文 我们简单讲了一下 springboot 项目的配置 都是写在resources下的application.properties中 springboot 项目中 配置都写在这一个文件 可以说非常方便 不像之前 写个项目配置这里一个哪里一个 看到是非常费力 我们启动项目 这里有个图案 其实 这叫 banner 我们就用配置来…...

蓝鲸平台通过标准运维 API 安装 Agent

目录 一、背景 二、目的 三、创建安装agent流程 四、通过标准运维 API 安装 Agent 五、总结 一、背景 蓝鲸平台正常情况纳管主机需要在节点管理手工安装agent&#xff0c;不能达到完成自动化安装agent的效果。想通过脚本一键安装agent&#xff0c;而不需要在蓝鲸平台进行过…...

python 图片保存成视频

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;工作总结链接&#xff1a;https://blog.csdn.net/qq_28949847/article/details/128552785 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c…...

uniapp 引入 Less SCSS

✨求关注~ &#x1f600;博客&#xff1a;www.protaos.com 本文将介绍如何在 UniApp 中引入 Less 和 SCSS&#xff0c;两种流行的 CSS 预处理器。通过使用 Less 和 SCSS&#xff0c;你可以在 UniApp 项目中更灵活地编写样式&#xff0c;并享受预处理器提供的便利功能。 代码实现…...

Linux程序设计:文件操作

文件操作 系统调用 write //函数定义 #include <unistd.h> size_t write(int fildes, const void *buf, size_t nbytes); //示例程序 #include <unistd.h> #include <stdlib.h> int main() { if ((write(1, “Here is some data\n”, 18)) ! 18)write(2, …...

【自制C++深度学习推理框架】Tensor模板类的设计思路

Tensor模板类的设计思路 为什么要把Armadillo线性代数库arma::fcube封装成Tensor模板类&#xff1f; arma::fcube是Armadillo线性代数库中的一种数据类型&#xff0c;它是一个三维的float类型张量。Armadillo库是一个C科学计算库&#xff0c;提供了高效的线性代数和矩阵运算。…...

linux--systemd、systemctl

linux--systemd、systemctl 1 介绍1.1 发展sysvinitupstart主角 systemd 登场 1.2 简介 2 优点兼容性启动速度systemd 提供按需启动能力采用 linux 的 cgroups 跟踪和管理进程的生命周期启动挂载点和自动挂载的管理实现事务性依赖关系管理日志服务systemd journal 的优点如下&a…...

加密解密软件VMProtect教程(七):主窗口之控制面板“详情”部分

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…...

国产仪器 4945B/4945C 无线电通信综合测试仪

4945系列无线电通信综合测试仪是多功能、便携式无线电综合测试类仪器&#xff0c;基于软件无线电架构&#xff0c;集成了跳频信号发生与分析、矢量信号发生与解调分析、模拟调制信号发生与解调分析、音频信号发生与分析、音频示波器、自动测试等功能&#xff0c;它可完成无线通…...

数据库原理及应用上机实验一

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;数据库原理及应用上机实验报告整理 目录 ✨一、实验目的和要求 ✨二、实验内容与步骤 &#x1f353;&#x1f353;前言&#xff1a; 数据库原理及应用上机实验报告的一个简单整理后期还会不断完善&#x1f353;&#x1f353;…...

【操作系统】线程常用操作

线程号 就像每个进程都有一个进程号一样&#xff0c;每个线程也有一个线程号。进程号在整个系统中是唯一的&#xff0c;但线程号不同&#xff0c;线程号只在它所属的进程环境中有效。 进程号用 pid_t 数据类型表示&#xff0c;是一个非负整数。线程号则用 pthread_t 数据类型…...

C++编译预处理

目录 一、包含头文件 1&#xff09;#include包含头文件又两种方式&#xff1a; ①#include<文件名>: ②#include"文件名"&#xff1a; 2&#xff09;C98标准后的头文件&#xff1a; ①C的标准库 ②C的标准库 3&#xff09;注意 二、宏定义 1&#xf…...

Spring IOC 的理解

IoC容器是什么&#xff1f; IoC文英全称Inversion of Control&#xff0c;即控制反转&#xff0c;我么可以这么理解IoC容器&#xff1a; “把某些业务对象的的控制权交给一个平台或者框架来同一管理&#xff0c;这个同一管理的平台可以称为IoC 容器。” 我们刚开始学习…...

Linux 学习笔记(七):时间片

一、时间片概念 时间片&#xff08;timeslice&#xff09;又称为 “量子”&#xff08;quantum&#xff09;或 “处理器片”&#xff08;processor slice&#xff09;&#xff0c;是分时操作系统分配给每个正在运行的进程微观上的一段 CPU 时间&#xff08;在抢占内核中是&…...

java并发-ReentrantLock

当多个线程需要同时对共享资源进行操作时&#xff0c;就需要用到线程同步技术。Java中提供了synchronized关键字用于线程同步&#xff0c;而ReentrantLock就是另外一种用于线程同步的技术&#xff0c;本文将介绍ReentrantLock及其使用方法。 ### 1. 概述 ReentrantLock是Java…...

21.模型的访问器和修改器

学习要点&#xff1a; 1.访问器 2.修改器 本节课我们来开始学习数据库模型的访问器和修改器的使用。 一&#xff0e;访问器 1. 访问器&#xff1a;就是在获取数据列表时&#xff0c;拦截属性并对属性进行修改的过程&#xff1b; 2. 比如&#xff0c;我们在输出性别时&#xff0…...

72 yaffs文件系统挂载慢 sync不起作用

1 引言 最近在开放过程中遇到了一个问题&#xff1a;Linux在启动挂载根文件系统时很慢很慢&#xff01;而且每次开机都是这样&#xff0c;一下子让人难以理解。 因为&#xff0c;理论上当机器第一次启动&#xff0c;会扫描完整的rootfs的flash区域&#xff0c;从而建立索引&…...

【无标题】春漫乌海湖!

春漫乌海湖! 杨桂林 黄河流经几字弯内蒙古段的第一段便遇见了镶嵌在大漠中的璀璨明珠乌海湖。 谁也不会相信:这里被乌兰布和、库布其、毛乌素三大沙漠重重包围&#xff0c;矿山林立&#xff0c;煤尘喧嚣飞扬的黑色煤都&#xff0c;如今在金色沙海的映衬下&#xff0c;柔润潋滟周…...

Red Hat重置root密码

目录 前言 1、使用rd.break参数重置root密码 2、使用安装盘重置root密码 前言 我们有时会忘记linux系统的root密码&#xff0c;有的不会重置密码只能重置系统了&#xff0c;下面介绍两种重置root密码的方法 1、使用rd.break参数重置root密码 1、启动系统&#xff0c;并在…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...