鸿蒙开发-UI-交互事件-通用事件

本文详细介绍了鸿蒙开发中UI组件的交互事件,包括触屏事件的触发、点击事件的回调、拖拽事件的流程及其接口,以及触摸事件的处理。后续将探讨键鼠事件和焦点事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鸿蒙开发-UI-组件导航-Tabs

鸿蒙开发-UI-图形-图片

鸿蒙开发-UI-图形-绘制几何图形

鸿蒙开发-UI-图形-绘制自定义图形

鸿蒙开发-UI-图形-页面内动画

鸿蒙开发-UI-图形-组件内转场动画

鸿蒙开发-UI-图形-弹簧曲线动画

鸿蒙开发-UI-交互事件

文章目录

前言

一、交互事件概述

二、通用事件

1.触屏事件

1.1点击事件

1.2 拖拽事件

1.3 触摸事件

总结


前言

上文详细学习了鸿蒙开发UI页面见的动画,了解了页面间动画的两种形式,一种用于页面间有相同元素场景,另一种是应用于页面转场时,随着一个页面出现另一个页面消失产生转场效果的场景。同时详细学习了页面进入时的和退出时分别对应的两种RouteType的类型的设置方式很效果,本文将学习鸿蒙开发UI交互事件相关知识

一、交互事件概述

二、通用事件

1.触屏事件

触屏事件指当手指/手写笔在组件上按下、滑动、抬起时触发的回调事件

1.1点击事件

当发生点击事件时,会触发以下回调函数

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

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

1.2 拖拽事件

拖拽事件触发流程

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

ArkUI支持应用内、跨应用的拖拽事件

拖拽事件相关接口

接口名称

描述

onDragStart(event: (event?: DragEvent, extraParams?: string) => CustomBuilder | DragItemInfo)

拖拽启动接口。当前仅支持自定义pixelmap和自定义组件。

onDragEnter(event: (event?: DragEvent, extraParams?: string) => void)

拖拽进入组件接口。DragEvent定义拖拽发生位置,extraParmas表示用户自定义信息

onDragLeave(event: (event?: DragEvent, extraParams?: string) => void)

拖拽离开组件接口。DragEvent定义拖拽发生位置,extraParmas表示拖拽事件额外信息。

onDragMove(event: (event?: DragEvent, extraParams?: string) => void)

拖拽移动接口。DragEvent定义拖拽发生位置,extraParmas表示拖拽事件额外信息。

onDrop(event: (event?: DragEvent, extraParams?: string) => void)

拖拽释放组件接口。DragEvent定义拖拽发生位置,extraParmas表示拖拽事件额外信息。

1.3 触摸事件

当按下(Down)、滑动(Move)、抬起(Up)等触摸事件触发时,调用回调函数

//event.type
//TouchType.Down:表示手指按下。
//TouchType.Up:表示手指抬起。
//TouchType.Move:表示手指按住移动。
onTouch(event: (event?: TouchEvent) => void)

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

代码示例


@Entry
@Component
struct TouchExample {
//step1:定义状态变量text用于Text组件文本显示
  @State text: string = '';
//step2:定义状态变量eventTypes用于接收触摸事件类型
  @State eventType: string = '';

  build() {
    Column() {
      Button('Touch').height(40).width(100)
//step3:通过onTouch定义Button组件的触摸事件响应逻辑
        .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)
  }
}


总结

本文学习了鸿蒙开发UI交互事件的类型,详细学习了通用事件的触屏事件,下文将学习通用事件中的键鼠事件和焦点事件。

### 鸿蒙 OS Worker 线程更新 UI 的方法 在鸿蒙操作系统中,Worker 是一种用于执行长时间运行的任务而不阻塞主线程的机制。由于 Worker 运行在一个独立的工作线程上,因此它无法直接访问或修改 UI 组件。为了实现从 Worker 线程向 UI 发送消息并更新界面的效果,通常采用以下几种方式: #### 使用 Emitter 实现线程间通信 Emitter 提供了一种发布/订阅模式的消息传递机制,允许不同线程之间发送和接收消息。可以在 Worker 中触发事件,在主线程监听这些事件来间接达到更新 UI 的目的。 ```typescript // 主线程代码片段 import emitter from '@ohos.event.emitter'; emitter.on('updateUI', (data) => { console.info(`Received data: ${JSON.stringify(data)}`); // 执行具体的UI更新逻辑 }); // Worker线程中的代码片段 export default function MyWorker() { let worker = new Worker(); worker.postMessage({ action: 'doSomething', payload: {} }); worker.onmessage = (event) => { const resultData = event.data; // 向主线程发出信号以请求刷新UI emitter.emit('updateUI', { message: "Update your UI here", ...resultData }); }; } ``` 此段代码展示了如何利用 `@ohos.event.emitter` 模块完成跨线程的数据交换[^1]。 #### 利用 AbilitySlice 上下文对象的方法调用 如果是在特定的应用场景比如Ability环境下工作,则可以直接借助AbilitySlice提供的接口来进行UI交互。例如,可以通过 abilityContext.runOnUIThread 来安排任务在UI线程上同步执行。 ```javascript abilityContext.runOnUiThread(() -> { // 在这里放置需要在线程中立即执行的操作 }); ``` 需要注意的是这种方法仅适用于某些特殊情况下,并不是通用解决方案[^3]。 #### 注意事项 - 创建过多的 Workers 可能会引起性能问题以及资源浪费;自 API 版本 9 起,当超过最大允许数目的时候将会引发初始化失败异常而不是简单的拒绝创建新的实例[^4]。 - 尽量减少不必要的线程切换次数,因为频繁地在这两者之间转换可能会带来额外开销影响程序效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值