鸿蒙开发系列教程(十五)--gesture 手势事件

gesture 手势事件

手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式。手势操作可以包括点击、滑动、双击、捏合等动作,用于实现不同的功能和操作。
在这里插入图片描述

gesture 常规手势


参考代码:

@Entry
@Component
struct Test03 {
  build() {
    Column() {
      Text('常规手势').fontSize(28)
        .gesture(
          //加载单击手势
          TapGesture()
            .onAction(() => {
              console.info('单击事件。。。。');
            }))
    }
    .height(200)
    .width(250)
  }
}

TapGesture 点击手势

指用户在触摸屏幕上进行点击操作时的手势,通常是快速点击屏幕一次。

当用户点击屏幕时,系统会将该操作识别为点击手势,并通知应用程序进行相应的处理。

TapGesture(value?:{count?:number; fingers?:number})

在这里插入图片描述

参考代码:

@Entry
@Component
struct Test03 {
  @State value: string = "";
  build() {
    Column() {
      Text('请双击').fontSize(30)
        .gesture(
          // count: 2--双击
          TapGesture({ count: 2 })
            .onAction((event: GestureEvent) => {
              //调取事件对象event
              //event.fingerList  触发点击的手指数量              //[{"id":1,"globalX":164,"globalY":62.333333333333336,"localX":54,"localY":9.333333333333334}]
              console.log(`${JSON.stringify(event.fingerList)}`)
              this.value = JSON.stringify(event.fingerList[0]);
              
            }))
    }
    .height("100%")
    .width("100")
  }
}

PanGesture 拖动手势

是一种用于在移动设备上识别用户手指拖动操作的手势。

通过拖动手势,用户可以在屏幕上拖动某个对象,例如移动一个图像、滚动一个列表或调整一个视图的位置。

包括以下几个基本元素:

起始点(起始位置):用户触摸屏幕的初始位置。
移动点(当前位置):用户在屏幕上滑动手指时的当前位置。
移动向量:起始点和移动点之间的向量,表示手指移动的方向和距离。

PanGestureOptions(value?:{ fingers?:number; direction?:PanDirection; distance?:number})
在这里插入图片描述

参考代码:

@Entry
@Component
struct Test03{
  @State offsetX: number = 0;
  @State offsetY: number = 0;
  @State positionX: number = 0;
  @State positionY: number = 0;

  build() {
    Column() {
      Text('拖动偏移量:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
        .fontSize(28)
        .height(200)
        .width(300)
        .padding(20)
        .border({ width: 5 })         
        .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
        .gesture(
          **PanGesture()**
            .onActionStart((event: GestureEvent) => {
              console.info('拖动开始');
            })
              // 触发拖动手势时调用
            .onActionUpdate((event: GestureEvent) => {
              this.offsetX = this.positionX + event.offsetX;
              this.offsetY = this.positionY + event.offsetY;
            })
            .onActionEnd(() => {
              this.positionX = this.offsetX;
              this.positionY = this.offsetY;
            })
        )
    }
    .height(500)
    .width(500)
  }
}

PinchGesture 捏合手势

通常在触摸屏上使用,涉及使用两个或更多的手指同时向内或向外移动,以缩小或放大屏幕上的内容。当手指向内移动时,被捏合的物体(如图片、网页等)将会被缩小;当手指向外移动时,被捏合的物体将会被放大。

在智能手机和平板电脑上浏览照片、地图、网页等时经常使用捏合手势来实现缩放功能。

PinchGesture(value?:{fingers?:number; distance?:number})
在这里插入图片描述

@Entry
@Component
struct Test03 {
  build() {
    Column() {
      Column() {
        Text('三指捏合缩放')       
      }
      .height(200)
      .width(300)
      .border({ width: 3 })
      .margin({ top: 100 })
      // 指定缩放比例
      //.scale({ x: this.scaleValue, y: this.scaleValue, z: 1 })
      .gesture(
        // 指定几指触发的捏合手势
        PinchGesture({ fingers: 3 })
          .onActionStart((event: GestureEvent) => {
            //开始事件
          })           
          .onActionUpdate((event: GestureEvent) => {
             //当捏合手势触发时
          })
          .onActionEnd(() => {
             //事件结束
          })
      )
    }
  }
}

LongPressGesture 长按手势

是指用户在屏幕上长时间按住一个元素或者某个区域,触发的手势操作。

长按手势通常用于实现某些特定的功能,比如弹出菜单、编辑文本、删除元素等。

长按手势的触发时间通常比较长,根据不同的应用场景,可以设置触发长按手势所需的最小按住时间。

包括以下几个阶段:

按下(Touch Down):用户按住屏幕上一个元素或者某个区域。
按住(Touch Hold):用户持续按住屏幕,一般在这个阶段内可以实现一些操作,比如拖动元素、改变元素的位置等。
触发(Touch Up Inside):用户松开手指,如果在按住阶段内达到某个条件,则会触发相应的操作,比如弹出菜单。

LongPressGesture(value?:{fingers?:number; repeat?:boolean; duration?:number})
在这里插入图片描述

参考代码

@Entry
@Component
struct Test03 {
  @State count: number = 0;

  build() {
    Column() {
      Text('长按 累加次数:' + this.count).fontSize(28)
        .gesture(
          // repeat: true 重复触发的LongPressGesture
          LongPressGesture({ repeat: true })
            .onAction((event: GestureEvent) => {
              console.log(`${JSON.stringify(event)}`)
              // {"repeat":true,"offsetX":0,"offsetY":0,"scale":1,"angle":0,"speed":0,"timestamp":0,"globalX":174,"globalY":16.666666666666668,"localX":33.666666666666664,"localY":16.666666666666668,"pinchCenterX":0,"pinchCenterY":0,"source":0,"pressure":0,"sourceTool":0,"fingerList":[{"id":1,"globalX":174,"globalY":16.666666666666668,"localX":33.666666666666664,"localY":16.666666666666668}],"target":{"area":{"position":{"x":0,"y":0},"globalPosition":{"x":0,"y":0},"width":0,"height":0}}}
              //每重复一次,累加一次
              if (event.repeat) {
                this.count++;
              }
            })
            .onActionEnd(() => {
              this.count = 0;
            })
        )
    }
    .height("100%")
    .width("100%")

  }
}

RotationGesture 旋转手势

用于识别用户在触摸屏上进行旋转操作的手势。在移动设备上,旋转手势通常使用两个手指来执行旋转操作。

在旋转手势中,用户可以用两个手指按住屏幕上的对象,并围绕一个旋转中心点进行旋转动作。

如在地图应用中旋转地图方向,或在图片编辑应用中旋转图像。

当用户进行旋转手势时,系统会根据手指的移动轨迹和角度变化来计算旋转角度,并将其作为旋转手势的输入。开发者可以通过手势识别库或框架来监听和处理旋转手势,以实现相应的功能。

RotationGesture(value?:{fingers?:number; angle?:number})

在这里插入图片描述

  Text('aaaa')
      .rotate({ angle: this.angle })
    .gesture(
      RotationGesture()
        .onActionStart((event: GestureEvent) => {       })            
        .onActionUpdate((event: GestureEvent) => {   })
        .onActionEnd(() => {        })
        .onActionCancel(() => { })
    )
}

SwipeGesture 滑动手势

通过在触摸屏上进行手指滑动操作来执行特定的动作或触发特定的事件。常用于移动应用程序中的页面导航、图片浏览、删除操作等场景。

滑动手势可以分为不同的方向,常见的包括向上滑动、向下滑动、向左滑动和向右滑动。

用户可以在屏幕上滑动手指,当手指的移动方向和距离达到一定的条件时,系统会识别为滑动手势,并根据具体需求执行相应的操作。

滑动手势通常使用在移动设备或触摸屏设备上,通过手指的滑动来完成操作,比如在手机上可以通过向左滑动删除一条消息,在图片浏览应用中可以通过向左滑动切换到下一张图片等。滑动手势的使用可以提高用户体验,使用户能够更自然、直观地与应用程序进行交互。

SwipeGesture(value?:{fingers?:number; direction?:SwipeDirection; speed?:number})
在这里插入图片描述

  Column() {
    Text("aaaa" )       
  }
  .border({ width: 3 })
  .width(300)
  .height(200)    
  .rotate({ angle: 30 })
  .gesture(     
    SwipeGesture({ direction: SwipeDirection.Vertical })      
      .onAction((event: GestureEvent) => {
       

      })
  )

组合手势

组合手势由多种单一手势组合而成,通过在GestureGroup中使用不同的GestureMode来声明该组合手势的类型

GestureGroup(mode:GestureMode, gesture:GestureType[])

  • mode:为GestureMode枚举类。用于声明该组合手势的类型。
  • gesture:由多个手势组合而成的数组。用于声明组合成该组合手势的各个手势。

连续识别

GestureMode为Sequence

连续识别组合手势将按照手势的注册顺序识别手势,直到所有的手势识别成功。

当连续识别组合手势中有一个手势识别失败时,所有的手势识别失败。

  Column() {
​        Text(“aaaa”)      
​    }
​    .height(250)
​    .width(300)
​    .gesture(
​      GestureGroup(GestureMode.Sequence, 
​        LongPressGesture({ repeat: true }) 
​          .onAction((event: GestureEvent|undefined) => { 
               //执行代码
           })
​          .onActionEnd(() => {
​                //执行代码
​          }),
​     
​        PanGesture()
​          .onActionStart(() => {
​                //执行代码
​          })
​          .onActionUpdate((event: GestureEvent|undefined) => {
​               //执行代码
​          })
​          .onActionEnd(() => {
​                //执行代码
​          })
​      )
​    )

并行识别

GestureMode为Parallel。

并行识别组合手势中注册的手势将同时进行识别,直到所有手势识别结束。

并行识别手势组合中的手势进行识别时互不影响。

   Column() {
​      Text(“aaaa”)    
​    }
​    .height(200)
​    .width(250)
​    .gesture(
​      GestureGroup(GestureMode.Parallel,
​        TapGesture({ count: 1 })
​          .onAction(() => {
​               //执行代码
​          }),
​        TapGesture({ count: 2 })
​          .onAction(() => {
​             //执行代码
​          })
​      )
​    )
  }

互斥识别

GestureMode为Exclusive

互斥识别组合手势中注册的手势将同时进行识别,若有一个手势识别成功,则结束手势识别,

其他所有手势识别失败。

​    Column() {
​      Text('aaa')      
​    }
​    .height(200)
​    .width(250)   
​    .gesture(
​      GestureGroup(GestureMode.Exclusive,
​        TapGesture({ count: 1 })
​          .onAction(() => {        
               //执行代码
​          }),
​        TapGesture({ count: 2 })
​          .onAction(() => {     
              //执行代码
​          })
​      )
​    )

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ map和set

1. 关联式容器 序列式容器:因为其底层为线性序列的数据结构,里面存储的是元素本身,比如:vector、list、deque 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对&#xff0…

【golang】24、go get 和 go mod:indrect 与 go mod tidy

文章目录 go get 会执行如下操作: 操作 go.mod 文件(add、update、remove)下载依赖到 $GOPATH/pkg/mod 中若已安装,则更新该包,到最新版本 试验前置准备:首先删除已下载的依赖,rm -rf $GOPATH…

STM32——LCD(1)认识

目录 一、初识LCD 1. LCD介绍 2. 像素 3. LED和OLED显示器 4. 显示器的基本参数 (1)像素 (2)分辨率 (3)色彩深度 (4)显示器尺寸 (5)点距 二、液晶…

[word] word大小写快捷键是什么? #知识分享#学习方法#笔记

word大小写快捷键是什么? word转换大小写的快捷方式是按“ShiftF3”。设置方法如下: 1、在电脑桌面找到需要转换大小写的文档,右键单击打开它。 2、打开文档之后,在文档里面选中需要转换的段落。 3、选中了之后在键盘里面找到“…

【已解决】onnx转换为rknn置信度大于1,图像出现乱框问题解决

前言 环境介绍: 1.编译环境 Ubuntu 18.04.5 LTS 2.RKNN版本 py3.8-rknn2-1.4.0 3.单板 迅为itop-3568开发板 一、现象 采用yolov5训练并将pt转换为onnx,再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn出现置信度大于1,并且图像乱框问题…

Python操作Word表格对齐、单元格对齐

通过Table的alignment可以设置表格居左对齐、居中对齐、居右对齐。通过Cell的vertical_alignment可以设置垂直位置。通过单元格里段落的alignment可以设置文本的左右对齐方式。 import docx from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT from…

李宏毅LLM——大模型+大资料的神奇力量

文章目录 大模型的重要性顿悟时刻 大资料的重要性数据预处理不一样的做法:KNN LM 对应视频P12-P14 大模型的重要性 模型参数和数据集越大,文字接龙的错误率越低 顿悟时刻 当模型超过10B-20B时,会突然顿悟 启示:不能只看最终结…

软件定义网络 SDN 简介、OpenFlow

目录 软件定义网络 SDN 简介 1 SDN 与 协议 OpenFlow 1.1 SDN 1.2 OpenFlow 1.2.1 协议 OpenFlow 1.2.2 OpenFlow 数据层面 (1)匹配 动作 (2)流表 1.流表由远程控制器管理 2.流表结构 2 SDN 体系结构 3 SDN 控制器 软…

机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧

文章目录 1.K-近邻算法思想2.K-近邻算法(KNN)概念3.电影类型分析4.KNN算法流程总结5.k近邻算法api初步使用机器学习库scikit-learn1 Scikit-learn工具介绍2.安装3.Scikit-learn包含的内容4.K-近邻算法API5.案例5.1 步骤分析5.2 代码过程 1.K-近邻算法思想 假如你有一天来到北京…

【 buuctf-后门查杀】

采用 D 盾进行扫描查杀 有一个级别为 5 的扫描结果,记事本打开,即为 flag

【保姆级教程|YOLOv8改进】【6】快速涨点,SPD-Conv助力低分辨率与小目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

Python进阶--爬取下载人生格言(基于格言网的Python3爬虫)

目录 一、此处需要安装第三方库: 二、抓包分析及Python代码 1、打开人生格言网(人生格言-人生格言大全_格言网)进行抓包分析 2、请求模块的代码 3、抓包分析人生格言界面 4、获取各种类型的人生格言链接 5、获取下一页的链接 6、获取人生格言的…

最新话费充值系统源码,附带系统安装教程

搭建教程 亲测环境:PHP7.0MySQL5.6 PHP扩展安装:sg11 数据库配置文件路径:/config/database.php 伪静态设置为thinkphp 后台地址:/admin 账号密码:admin/123456

SpringBoot源码解读与原理分析(八)ApplicationContext

文章目录 3.1.2 ApplicationContext3.1.2.1 ApplicationContext根接口3.1.2.2 ConfigurableApplicationContext3.1.2.3 EnvironmentCapable3.1.2.4 MessageSource3.1.2.5 ApplicationEventPublisher3.1.2.6 ResourcePatternResolver3.1.2.7 AbstractApplicationContext3.1.2.8 …

当我们一起走过 2023|Apache Doris 年度时刻盘点

2024 年的第一个月已经彻底过去,2023 年的回顾总结才姗姗来迟。 在过去一年的大多数时间里,我们一直处于忙碌的状态中,紧锣密鼓的代码研发、高速推进的版本迭代、行程紧密的全国之行,众多社区用户与开发者皆是见证。 越是忙碌&a…

Yearning审核平台本地安装配置并结合内网穿透实现远程访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用…

vector类的模拟实现

实现基本的vector框架 参考的是STL的一些源码&#xff0c;实现的vector也是看起来像是一个简略版的&#xff0c;但是看完能对vector这个类一些接口函数更好的认识。 我们写写成员变量&#xff0c;先来看看STL的成元变量是那些 namespace tjl {template<class T>class …

【C语言|数据结构】数据结构顺序表

目录 一、数据结构 1.1概念 1.2总结 1.3为什么需要数据结构&#xff1f; 二、顺序表 1.顺序表的概念及结构 1.1线性表 2.顺序表分类 2.1顺序表和数组的区别 2.2顺序表的分类 2.2.1静态顺序表 2.2.1.1概念 2.2.1.2缺陷 2.2.2动态顺序表 三、动态顺序表的实现 3.1新…

Pandas文本数据处理技术指南—从查找到时间序列分析【第66篇—python:文本数据处理】

文章目录 Pandas文本数据处理技术指南引言 1. 查找文本数据2. 替换文本数据3. 拼接文本数据4. 正则表达式操作5. 虚拟变量6. 处理缺失值7. 分割文本数据8. 字符串处理方法9. 文本数据的合并与连接10. 文本数据的排序11. 文本数据的统计分析12. 文本数据的分组与聚合13. 文本数据…

使用Softing edgeConnector模块将云轻松连接到Siemens PLC

一 工业边缘的连接解决方案 云服务提供商 (CSP) 引入了服务和功能&#xff0c;以简化基于云的工业物联网解决方案的实施。Azure Industrial IoT Platform或AWS IoT SiteWise支持标准协议和接口&#xff0c;例如OPC UA或MQTT。但是&#xff0c;如果您希望在典型的旧改项目中连接…