鸿蒙交互事件开发01——点击/拖拽/触摸事件

news2024/11/17 4:17:52

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

1    概    述   

事件是人机交互的基础,鸿蒙开发中,事件分为两大类:a)通用事件;b)手势事件。

👉🏻 通用事件

通用事件又可以按照触发类型来分类,分为三大类:触屏事件、键鼠事件和焦点事件。

  1. 触屏事件:手指或手写笔在触屏上的单指或单笔操作。

  2. 键鼠事件:包括外设鼠标或触控板的操作事件和外设键盘的按键事件。

    1. 鼠标事件是指通过连接和使用外设鼠标/触控板操作时所响应的事件。

    2. 按键事件是指通过连接和使用外设键盘操作时所响应的事件。

  3. 焦点事件:通过以上方式控制组件焦点的能力和响应的事件。

👉🏻 手势事件

手势事件由绑定手势方法和绑定的手势组成,绑定的手势可以分为单一手势和组合手势两种类型,根据手势的复杂程度进行区分。

  • 绑定手势方法:用于在组件上绑定单一手势或组合手势,并声明所绑定的手势的响应优先级。

  • 单一手势:手势的基本单元,是所有复杂手势的组成部分。

  • 组合手势:由多个单一手势组合而成,可以根据声明的类型将多个单一手势按照一定规则组合成组合手势,并进行使用。

下面,我们先了解下最常用事件:触屏事件,即:点击、拖拽、触摸事件。

点 击 事 件 

点击事件是指通过手指或手写笔做出一次完整的按下和抬起动作。当发生点击事件时,会触发以下回调函数:

onClick(event: (event?: ClickEvent) => void)

event参数提供点击事件相对于窗口或组件的坐标位置,以及发生点击的事件源。

例如通过按钮的点击事件控制图片的显示和隐藏,代码如下:

@Entry@Componentstruct IfElseTransition {  @State flag: boolean = true;  @State btnMsg: string = 'show';  build() {    Column() {      Button(this.btnMsg).width(80).height(30).margin(30)        .onClick(() => {          if (this.flag) {            this.btnMsg = 'hide';          } else {            this.btnMsg = 'show';          }          // 点击Button控制Image的显示和消失          this.flag = !this.flag;        })      if (this.flag) {        Image($r('app.media.icon')).width(200).height(200)      }    }.height('100%').width('100%')  }}

拖 拽 事 件 

拖拽事件指手指/手写笔长按组件(>=500ms),并拖拽到接收区域释放的事件。拖拽事件触发流程:

图片

拖拽事件的触发通过长按、拖动平移判定,手指平移的距离达到5vp即可触发拖拽事件。ArkUI支持应用内、跨应用的拖拽事件。

拖拽事件提供以下接口,整理展示如下:

图片

如下是跨窗口拖拽,拖出窗口示例:​​​​​​​

import image from '@ohos.multimedia.image';@Entry@Componentstruct Index {  @State visible: Visibility = Visibility.Visible  private pixelMapReader = undefined  aboutToAppear() {    console.info('begin to create pixmap has info message: ')    this.createPixelMap()  }  createPixelMap() {    let color = new ArrayBuffer(4 * 96 * 96);    var buffer = new Uint8Array(color);    for (var i = 0; i < buffer.length; i++) {      buffer[i] = (i + 1) % 255;    }    let opts = {      alphaType: 0,      editable: true,      pixelFormat: 4,      scaleMode: 1,      size: { height: 96, width: 96 }    }    const promise = image.createPixelMap(color, opts);    promise.then((data) => {      console.info('create pixmap has info message: ' + JSON.stringify(data))      this.pixelMapReader = data;    })  }  build() {    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {      Text('App1')        .width('40%')        .height(80)        .fontSize(20)        .margin(30)        .textAlign(TextAlign.Center)        .backgroundColor(Color.Pink)        .visibility(Visibility.Visible)      Text('Across Window Drag This')        .width('80%')        .height(80)        .fontSize(16)        .margin(30)        .textAlign(TextAlign.Center)        .backgroundColor(Color.Pink)        .visibility(this.visible)        .onDragStart(() => {                    //启动跨窗口拖拽          console.info('Text onDrag start')          return { pixelMap: this.pixelMapReader, extraInfo: 'custom extra info.' }        })        .onDrop((event: DragEvent, extraParams: string) => {          console.info('Text onDragDrop,  ')          this.visible = Visibility.None                    //拖动结束后,使源不可见        })    }    .width('100%')    .height('100%')  }}

跨窗口拖拽,拖入示例:​​​​​​​

@Entry@Componentstruct Index {  @State number: string[] = ['drag here']  @State text: string = ''  @State bool1: boolean = false  @State bool2: boolean = false  @State visible: Visibility = Visibility.Visible  @State visible2: Visibility = Visibility.None  scroller: Scroller = new Scroller()  build() {    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {      Text('App2')        .width('40%')        .height(80)        .fontSize(20)        .margin(30)        .textAlign(TextAlign.Center)        .backgroundColor(Color.Pink)        .visibility(Visibility.Visible)      List({ space: 20, initialIndex: 0 }) {        ForEach(this.number, (item) => {          ListItem() {            Text('' + item)              .width('100%')              .height(80)              .fontSize(16)              .borderRadius(10)              .textAlign(TextAlign.Center)              .backgroundColor(0xFFFFFF)          }        }, item => item)        ListItem() {          Text('Across Window Drag This')            .width('80%')            .height(80)            .fontSize(16)            .margin(30)            .textAlign(TextAlign.Center)            .backgroundColor(Color.Pink)            .visibility(this.visible2)        }      }      .height('50%')      .width('90%')      .border({ width: 1 })      .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 })      .onDragEnter((event: DragEvent, extraParams: string) => {                         //拖拽进去组件        console.info('List onDragEnter, ' + extraParams)      })      .onDragMove((event: DragEvent, extraParams: string) => {                          //拖拽时移动        console.info('List onDragMove, ' + extraParams)      })      .onDragLeave((event: DragEvent, extraParams: string) => {                         //拖拽离开组件        console.info('List onDragLeave, ' + extraParams)      })      .onDrop((event: DragEvent, extraParams: string) => {                              //释放组件        console.info('List onDragDrop, ' + extraParams)        this.visible2 = Visibility.Visible                                              //拖拽完成使拖入目标可见      })    }    .width('100%')    .height('100%')  }}

触 摸 事 件 

当手指或手写笔在组件上触碰时,会触发不同动作所对应的事件响应,包括按下(Down)、滑动(Move)、抬起(Up)事件:

onTouch(event: (event?: TouchEvent) => void)
    • event.type为TouchType.Down:表示手指按下。

    • event.type为TouchType.Up:表示手指抬起。

    • event.type为TouchType.Move:表示手指按住移动。

触摸事件可以同时多指触发,通过event参数可获取触发的手指位置、手指唯一标志、当前发生变化的手指和输入的设备源等信息。​​​​​​​

// xxx.ets@Entry@Componentstruct TouchExample {  @State text: string = '';  @State eventType: string = '';  build() {    Column() {      Button('Touch').height(40).width(100)        .onTouch((event: TouchEvent) => {          if (event.type === TouchType.Down) {            this.eventType = 'Down';          }          if (event.type === TouchType.Up) {            this.eventType = 'Up';          }          if (event.type === TouchType.Move) {            this.eventType = 'Move';          }          this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '          + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('          + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'          + event.target.area.width + '\nheight:' + event.target.area.height        })      Button('Touch').height(50).width(200).margin(20)        .onTouch((event: TouchEvent) => {          if (event.type === TouchType.Down) {            this.eventType = 'Down';          }          if (event.type === TouchType.Up) {            this.eventType = 'Up';          }          if (event.type === TouchType.Move) {            this.eventType = 'Move';          }          this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '          + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('          + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'          + event.target.area.width + '\nheight:' + event.target.area.height        })      Text(this.text)    }.width('100%').padding(30)  }}

图片

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

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

相关文章

EmguCV学习笔记 VB.Net 2.1 颜色空间和颜色

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址&#xff1a;VB.Net-CSDN博客 教程相关说明以及如何获得pdf教程…

威胁组织伪造Loom,Mac用户警惕AMOS窃取软件威胁

近期&#xff0c;一个复杂且可能与神秘威胁组织“Crazy Evil”有关联的网络犯罪活动&#xff0c;已将注意力转向了Mac用户群体。该组织利用广受欢迎的屏幕录制工具Loom作为掩护&#xff0c;悄无声息地传播着臭名远扬的AMOS数据窃取软件。Moonlock Lab的安全研究员们揭开了这一阴…

【数据结构与算法 | 图篇】拓扑排序

1. 概念 拓扑排序是是一种针对有向无环图进行的排序方法。它将图中所有顶点排成一个线性序列&#xff0c;使得对于图中的每一条有向边(u, v)&#xff0c;顶点u在序列中都出现在顶点v之前。 适用范围&#xff1a; 拓扑排序只适用于有向无环图。 结果非唯一&#xff1a; 对于…

阿里云ubuntu系统安装mysql8.0

一、安装mysql8.0 1.已安装其他版本的mysql&#xff0c;需要删除 若没有不需要此操作 1 #卸载MySQL5.7版本 2 apt remove -y mysql-client5.7* mysql-community-server5.7* 4 # 卸载5.7的仓库信息 5 dpkg-l | grep mysql | awk iprint $2} | xargs dpkg -P2.更新仓库 apt u…

FASTSPEECH 2论文阅读

FASTSPEECH 2: FAST AND HIGH-QUALITY END-TOEND TEXT TO SPEECH 现状 非自回归模型可以在质量相当的情况下显著快于先前的自回归模型合成模型。但FastSpeech模型训练依赖与自回归教师模型进行时长预测&#xff08;提供更多的信息作为输入&#xff09;和知识蒸馏&#xff08;…

【开端】Java中判断一个对象是否是空内容

一、绪论 在Java中&#xff0c;我们常常使用的到的就是封装&#xff0c;为什么要封装&#xff0c;封装有什么好处。首先在系统开发过程中&#xff0c;其实很多功能和场景都共性的。那么为了避免重复造轮子&#xff0c;我们这时就使用到了封装。封装可以一次造轮子&#xff0c;无…

数据集搜索

1. 数据集和数据集的分类 数据集是一组数据的集合&#xff0c;通常用于机器学习、统计分析、数据挖掘等领域&#xff0c;帮助算法训练、模型验证和评估。可以是各种形式的数据&#xff0c;如表格、图像、机器学习相关的文件等。 根据在机器学习中的应用&#xff0c;数据集可以…

1. MongoDB概念解析

1. 概念解析 在 MongoDB 中基本的概念是文档、集合、数据库。 SQL 术语/概念MongoDB 术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引table joins表连接,MongoDB不支持primary keypri…

1.3 数据库的发展历史与演变

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

鸿萌数据恢复服务: 如何修复 SQL Server 数据库错误 829?

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份、网络及终端数据安全等解决方案与服务。 同时&#xff0c;鸿萌是众多国际主流数据恢复软件(Stellar、UFS、R-Studio、ReclaiMe Pro 等)的授权代理商&#xff0c…

pandas 笔记crosstab

用来计算两个&#xff08;或更多&#xff09;因子的交叉表&#xff08;即频率表、列联表或透视表&#xff09;。这个功能特别适用于统计分析和数据探索阶段&#xff0c;帮助理解不同变量之间的关系 1 基本用法 pd.crosstab(index, columns, valuesNone, rownamesNone, colnam…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(二)---ROS2与UE5进行图像数据传输

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础&#xff0c;Nav2相关的学习教程可以参考本人的其他博…

HarmonyOS-MPChart以X轴或y轴为区间设置不同颜色

本文是基于鸿蒙三方库mpchart OpenHarmony-SIG/ohos-MPChart 的使用&#xff0c;以X轴为区间设置不同的曲线颜色。 mpchart本身的绘制功能是不支持不同区间颜色不同的曲线的&#xff0c;那么当我们的需求曲线根据x轴的刻度区间绘制不同颜色&#xff0c;就需要自定义绘制方法了。…

LVS (Linux virual server)

LVS简介 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于Linux平台的开源负载均衡系统。它通过将多个服务器组成一个虚拟服务器集群&#xff0c;实现了高效的负载均衡和流量分发。 LVS的核心思想是利用IP负载均衡技术和内容请求分发机制&a…

传知代码-【CLIP】文本也能和图像配对

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 模态&#xff1a;数据的一种形式&#xff0c;如图像、文本、声音、点云等。 多模态学习&#xff0c;就是利用模型同时处理多个模态数据&#xff0c;有助于提高模型的准确性和泛化能力。在自动驾驶场景中&am…

利用住宅代理应对机器人流量挑战:识别、使用与检验指南

引言 什么是机器人流量&#xff1f;其工作原理是什么&#xff1f; 机器人流量来自哪里&#xff1f; 合法使用机器人时如何避免被拦截&#xff1f; 如何检验恶意机器人流量&#xff1f; 总结 引言 你是否曾经遇到过访问某个网站时&#xff0c;被要求输入验证码或完成一些其…

源代码加密的意义和办法?

一、源代码加密的意义1、防止恶意修改&#xff1a;未加密的源代码容易被恶意用户或竞争对手获取并修改&#xff0c;以植入恶意代码或病毒&#xff0c;损害软件的功能性和安全性。加密后的源代码即使被非法获取&#xff0c;也无法修改或理解&#xff0c;从而防止了被破坏的风险。…

品味白酒的四大步骤,体验不一样的美酒人生

在华夏千年的文化传承中&#xff0c;白酒如同一部厚重的历史长卷&#xff0c;每一滴都蕴含着丰富的故事与智慧。豪迈白酒&#xff08;HOMANLISM&#xff09;&#xff0c;作为这长卷中的璀璨篇章&#xff0c;更是以其不同的魅力&#xff0c;吸引着无数品鉴者去探寻其中的奥秘。今…

android13 禁用wifi

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码分析 3.1 代码位置1 3.2 代码位置2 3.3 代码位置3 4.代码修改 5. 彩蛋 1.前言 这个文章讲的是,在frameworks里面禁止打开wifi。 2.情况分析 我们打开wifi一般是 public static void turnOnWifi(Co…

Linux修改ssh默认端口22为其他端口2024

一、修改配置文件 修改ssh服务的配置文件&#xff1a; /etc/ssh/sshd_config 将Port 22放开注释&#xff0c;并将22修改为2024&#xff0c;并保存 二、重启sshd服务 systemctl restart sshd 三、重启服务失败 如果重启服务失败&#xff0c;可以执行以下命令&#xff1a; …