当前位置: 首页 > 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;并在…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...