鸿蒙交互事件开发07——手势竞争问题

 如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

1、背景

在文章鸿蒙交互事件开发05——常用的6种手势类型中,有朋友留言,问“可不可以就文中提到的手势竞争,举例子讲一讲?”。

⭐️ 文中提到的手势竞争是什么呢?

是在讨论PanGesture拖动手势时,章节末尾有个tips,内容如下:

大部分可滑动组件,如List、Grid、Scroll、Tab等组件是通过PanGesture实现滑动,在组件内部的子组件绑定拖动手势(PanGesture)或者滑动手势(SwipeGesture)会导致手势竞争。

当在子组件绑定PanGesture时,在子组件区域进行滑动仅触发子组件的PanGesture。如果需要父组件响应,需要通过修改手势绑定方法或者子组件向父组件传递消息进行实现,或者通过修改父子组件的PanGesture参数distance使得拖动更灵敏。当子组件绑定SwipeGesture时,由于PanGesture和SwipeGesture触发条件不同,需要修改PanGesture和SwipeGesture的参数以达到所需效果。

这里主要想说明的是:鸿蒙原生组件中的内置滑动组件(List、Scroll等)的滑动是基于拖动手势或者滑动手势来实现,如果我们在这些系统组件中也用了类似的手势作为子组件,那么可能会导致父组件的功能异常。

实际业务场景非常复杂,我这边举一个简单的例子来抛砖引玉。

2、场景举例

有一个List列表,其中List列表的列表项是一个容器,其中这些容器中的内容是可以被拖动的。示意图如下:

图片

这里面我们可以看到有问题出现了。

  1.  List列表可以上下滑动;

  2. list列表项中的子元素也可以被拖动(包括上下拖动);

不出意外,我们在实现子元素拖动时,会使用到PanGesture拖动手势,此时,PanGesture手势将会和List容器的上下滑动冲突。

怎么解决这个问题呢?

跟随前文的tips思路,我们可以考虑在"灵敏度"上面做区分。

例如:

👉🏻 当我们在子项中点击某个按钮时,将子元素的distance设置大一些将事件让给父容器(List)

👉🏻 当我们再点击某个按钮时,将子元素的distance设置小一些,让子元素的事件触发更容易,从而起到子元素响应该手势。

按照上面的方式,我们就可以动态控制手势事件的消费目标了。

3、Demo

实现一个效果:

List列表中显示一系列列表项,每个列表项中包含一个按钮,通过这个按钮可以切换列表项的PanGesture的distance,从而让子容器的PanGesture灵敏度发生变化,达到切换滑动效果的目的。

演示如下:

图片

代码如下:

import util from '@ohos.util';@Entry@Componentstruct Demo {  gestureDistance: number = 20;  @State data: Array<string> = this.getData(20);  private getData(distance: number): Array<string> {    const arr = [];    for (let index = 0; index < 50; index++) {      arr.push(`内部可以处理拖动的容器 ${index}\n\n\ndistance ${distance}`);    }    return arr;  }  build() {    List() {      ForEach(this.data, (item: string, idx: number) => {        ListItem() {          Row() {            Row() {              Text(item)              Blank()              Button('切换distance')                .onClick(() => {                  this.gestureDistance = this.gestureDistance === 20 ? 4 : 20;                  console.log('切换 distance ', this.gestureDistance);                  this.data = this.getData(this.gestureDistance);                })            }            .padding(5)            .width('100%')            .height(150)            .stateStyles({              pressed: {                .backgroundColor(Color.Brown)                .borderRadius(30)                .animation({duration: 500, curve: Curve.Ease})              },              normal: {                .backgroundColor(Color.Pink)                .borderRadius(10)                .animation({duration: 500, curve: Curve.Ease})              }            })          }          .width('100%')          .padding(5)          .gesture(            PanGesture({              direction: PanDirection.Vertical,              distance: this.gestureDistance,            }).onActionStart((event: GestureEvent) => {              console.log('action start')            })          )        }      })    }    .width('100%')  }}

🥚彩蛋🥚:请注意demo中按压和释放的动画效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/141438.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C语言自定义类型-联合与枚举

在之前的文章中&#xff0c;我们学到了结构体类型&#xff0c;而结构体其实归属于一个大类——自定义类型。那么今天我们就继续讲解关于自定义类型的知识~ 一、类型命名关键字-typedef typedef的作用其实就是标题的意思——为一种类型赋予新的名字。 ① typedef在变量中的应…

Java【集合】

一、集合的概述 集合建立在数组基础上&#xff0c;主要位于java.util包中&#xff0c;用来存储Java类对象&#xff0c;并且可以实现各种数据结构。 集合大小可以改变&#xff0c;可以存放不同数据类型数据。集合不能存放基本类型数据&#xff0c;只能存放引用数据类型数据。集…

力扣题解2848

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;简单&#xff09;&#xff1a; 与车相交的点 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &…

中考全国45套(全国教育发达地区中考试卷)

文章目录 获取方式 为什么选择这份资源&#xff1f; 权威性与全面性&#xff1a;我们精心搜集了全国教育发达地区的最新中考试卷&#xff0c;确保每一套试卷都代表了该地区的教学水平和考试趋势。这不仅涵盖了丰富的知识点&#xff0c;还融入了各地独特的命题风格&#xff0c;让…

2020ICPC上海 D - Walker M - Gitignore

D: 首先显然要二分,判断当前二分的mid时间下是否能满足走满0~n 枚举所有情况,这里按照左,右起点p1,p2分别讨论 p1向左 p2向左(以下向左和向右都代表向左或者向右到墙,而不代表初速度方向)&#xff0c;只需要计算p1或者p2反弹之后还能走距离n就是合法 p1向左 p2向右&#xff…

3.4.2 __ipipe_init_early之fixup_percpu_data()

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 3.4.2 __ipipe_init_early之fixup_percpu_data() 这个函数只有在CPU是SMP对称多core的情况下&#xff0c;才会真正运作&#xff0c;否则就是个空函数。 #ifdef CONFIG_SMPstatic inline void fixup_percpu_data…

H5 three.js 实现六年级观察物体

o(&#xffe3;▽&#xffe3;)ブ 我又带着新的demo来啦~ 预览 功能点 立方体的阴影 立方体的添加 位置记录 最大限制 三视图展示 立方体的移除 答题模式 随机出题 题库出题 源码 注释算是比较全了&#xff0c;可能部分会有点绕&#xff0c;还能够再优化一下~ <!DOCTYPE …

【代码随想录训练营第42期 续Day58打卡 - 图论Part8 - Dijkstra算法

目录 一、Dijkstra算法 实现方式 1、使用优先队列&#xff08;最小堆&#xff09; 2、朴素法&#xff08;简单数组&#xff09; 二、经典例题 题目&#xff1a;卡码网 47. 参加科学大会 题目链接 题解&#xff1a;朴素Dijkstra 三、小结 一、Dijkstra算法 刚入门Dijks…

AI论文写作测评!类似茅茅虫论文写作助手网站

在当前的学术研究和写作环境中&#xff0c;AI论文写作助手成为了许多学者和学生的重要工具。其中&#xff0c;千笔-AIPassPaper和茅茅虫论文写作助手是两款备受关注的平台。本文将对这两款工具进行详细测评&#xff0c;并推荐适合不同需求的用户使用。 千笔-AIPassPaper AI论文…

实现领域驱动设计(DDD)系列详解:限界上下文

随着微服务的兴起&#xff0c;限界上下文更是被拔高到战略设计的核心地位&#xff0c;也成了连接问题空间与解空间的重要桥梁&#xff0c;但不可否认&#xff0c;一方面&#xff0c;领域驱动设计社区纷纷发声强调它的重要性&#xff1b;另一方面&#xff0c;还有很多人依旧弄不…

游戏算法专题之PRD算法:听说你想凭运气抽中荣耀水晶?

PRD算法全称Pseudo-Random Distribution。是概率分布中的一种常见算法&#xff0c;在游戏开发领域中很常用。 PRD用于控制随机事件的触发概率&#xff0c;使其表现得更加符合预期&#xff0c;相比于传统得随机数生成&#xff0c;PRD算法可以平滑得控制随机事件的触发次数&…

计算机毕业设计 二手闲置交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

什么是快充协议,最常见的快充协议有哪些

什么是快充协议 随着手机快充的出现大家都知道快充技术但很多人确不知道快充协议&#xff0c;在快充技术里快充协议是必不可少的&#xff0c;那么今天我们就来探讨一下什么是快充协议&#xff1f; 快充协议是一种通过提高充电效率来缩短设备充电时间的电池充电技术。它通过在充…

主播和礼品检测系统源码分享

主播和礼品检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

约瑟夫环和一元多项式修正版

这里先附上上一篇博文的链接大家可以对比着看&#xff0c;错误已经改正https://blog.csdn.net/2302_78946488/article/details/141751514?spm1001.2014.3001.5501 约瑟夫环 以下是详细代码 //约瑟夫环 #include<stdio.h> #include<stdlib.h> //建立链表结点 str…

【Unity】 HTFramework框架(五十六)MarkdownText:支持运行时解析并显示Markdown文本

更新日期&#xff1a;2024年9月15日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 MarkdownText支持的Markdown语法标题强调文本表格嵌入图像超链接 使用MarkdownText设置项运行时属性解析使用ID模式嵌入图像 MarkdownText MarkdownText…

句子成分——每日一划(八)

目录 一、原句 二、第一部分 三、第二部分 一、原句 In class society everyone lives as a member of a particular class, and every kind of thinking, without exception, is stamped with the brand of a class. 来源&#xff1a;二、阶级和阶级斗争 二、第一部分 In…

QT添加图标标题和打包项目

QT项目打包 项目的标题和图标标题项目图标exe图标 可执行文件——生成exeexe运行报错“找不到qt6gui.dll”等 相关库文件——生成zip安装包打包程序——生成exe安装包 项目的标题和图标 项目打包要好看点&#xff0c;得有个好点的标题和图标&#xff0c;这次打包的项目是我上一…

图论篇--代码随想录算法训练营第五十八天打卡|拓扑排序,dijkstra(朴素版),dijkstra(堆优化版)精讲

拓扑排序 题目链接&#xff1a;117. 软件构建 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依赖于文件 B&#xff0…

【移动端】菜单的自动展开与收回

前言 为了满足手机上菜单栏随用户移动&#xff0c;菜单的自动展示与隐藏&#xff0c;特此记录 基本原理 实现逻辑 window.addEventListener(‘scroll’, debouncedScrollHandler) – 监听文档视图滚动事件 document.querySelector(‘.header’) – 选择器匹配元素 创建show和h…