鸿蒙HarmonyOS实战-ArkUI事件(触屏事件)

火影  金牌会员 | 2024-8-24 02:57:38 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 545|帖子 545|积分 1635

 媒介

触屏事件是指通过触摸屏幕来举行操纵和交互的事件。常见的触屏事件包括点击(tap)、双击(double tap)、长按(long press)、滑动(swipe)、拖动(drag)等。触屏事件通常用于移动设备和平板电脑等具有触摸屏幕的设备上,用户可以通过触摸屏幕上的不同区域大概以不同的方式举行操纵,从而实现各种功能和交互效果。触屏事件可以被应用程序大概操纵系统捕捉并相应,以实现用户与设备之间的交互。
一、触屏事件

在HarmonyOS中,触屏事件包括点击事件、拖拽事件和触摸事件,开发者可以通过使用HarmonyOS的触摸事件处理机制来捕捉和处理这些事件。

  • 点击事件(Click Event):当用户在屏幕上单击时触发。开发者可以通过重写onTouch或onTouchEvent方法来监听并处理点击事件。在处理点击事件时,可以获取点击位置的坐标、点击的View等信息。
  • 拖拽事件(Drag Event):当用户在屏幕上按住并拖动时触发。开发者可以通过重写onTouch或onTouchEvent方法来监听并处理拖拽事件。在处理拖拽事件时,可以获取当前拖拽的位置、起始位置、拖拽的View等信息。
  • 触摸事件(Touch Event):触摸事件是一系列的事件,包括按下、抬起、移动等。开发者可以通过重写onTouch或onTouchEvent方法来监听并处理触摸事件。在处理触摸事件时,可以获取触摸的位置、触摸的View等信息。
除了重写onTouch或onTouchEvent方法来处理触摸事件外,开发者还可以使用View.OnTouchListener接口来监听和处理触摸事件。通过设置View的OnTouchListener,可以实现对触摸事件的更加灵活的控制和处理。
触摸事件原理:

1.点击事件

点击事件是指用户通过鼠标或触摸屏等输入设备点击(或触摸)页面上的元素时触发的一种相应机制。当用户点击一个元素时会捕捉到点击事件,并执行相应的处理代码。点击事件常用于实现用户交互,比如点击按钮提交表单、点击链接跳转页面等操纵。
接口如下:
  1. onClick(event: (event?: ClickEvent) => void)
复制代码
案例如下:
  1. @Entry
  2. @Component
  3. struct IfElseTransition {
  4.   @State flag: boolean = true;
  5.   @State btnMsg: string = 'show';
  6.   build() {
  7.     Column() {
  8.       Button(this.btnMsg).width(80).height(30).margin(30)
  9.         .onClick(() => {
  10.           if (this.flag) {
  11.             this.btnMsg = 'hide';
  12.             console.log('hide');
  13.           } else {
  14.             this.btnMsg = 'show';
  15.             console.log('show');
  16.           }
  17.           // 点击Button控制Image的显示和消失
  18.           this.flag = !this.flag;
  19.         })
  20.       if (this.flag) {
  21.         Image($r('app.media.icon')).width(200).height(200)
  22.       }
  23.     }.height('100%').width('100%')
  24.   }
  25. }
复制代码

2.拖拽事件

拖拽事件是一种用户交互行为,指的是在计算机中,用户通过鼠标或触摸屏按住某个元素,拖动它并释放的操纵。拖拽事件通常分为三个阶段:开始拖拽、正在拖拽和结束拖拽。开始拖拽阶段是指当用户按住要拖拽的元素时触发的事件。正在拖拽阶段是指用户持续拖动元素时触发的事件。结束拖拽阶段是指用户释放鼠标或手指时触发的事件。拖拽事件可以用于实现一些交互效果,例如拖拽排序、拖拽放置和拖拽改变元素位置等。
接口如下:
接口名称形貌onDragStart(event: (event?: DragEvent, extraParams?: string) => CustomBuilderDragItemInfo)拖拽启动接口。当前仅支持自定义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. import image from '@ohos.multimedia.image';
  2. @Entry
  3. @Component
  4. struct Index {
  5.   @State visible: Visibility = Visibility.Visible
  6.   private pixelMapReader = undefined
  7.   aboutToAppear() {
  8.     console.info('begin to create pixmap has info message: ')
  9.     this.createPixelMap()
  10.   }
  11.   createPixelMap() {
  12.     let color = new ArrayBuffer(4 * 96 * 96);
  13.     var buffer = new Uint8Array(color);
  14.     for (var i = 0; i < buffer.length; i++) {
  15.       buffer[i] = (i + 1) % 255;
  16.     }
  17.     let opts = {
  18.       alphaType: 0,
  19.       editable: true,
  20.       pixelFormat: 4,
  21.       scaleMode: 1,
  22.       size: { height: 96, width: 96 }
  23.     }
  24.     const promise = image.createPixelMap(color, opts);
  25.     promise.then((data) => {
  26.       console.info('create pixmap has info message: ' + JSON.stringify(data))
  27.       this.pixelMapReader = data;
  28.     })
  29.   }
  30.   @Builder pixelMapBuilder() {
  31.     Text('drag item')
  32.       .width('100%')
  33.       .height(100)
  34.       .fontSize(16)
  35.       .textAlign(TextAlign.Center)
  36.       .borderRadius(10)
  37.       .backgroundColor(0xFFFFFF)
  38.   }
  39.   build() {
  40.     Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  41.       Text('App1')
  42.         .width('40%')
  43.         .height(80)
  44.         .fontSize(20)
  45.         .margin(30)
  46.         .textAlign(TextAlign.Center)
  47.         .backgroundColor(Color.Pink)
  48.         .visibility(Visibility.Visible)
  49.       Text('Across Window Drag This')
  50.         .width('80%')
  51.         .height(80)
  52.         .fontSize(16)
  53.         .margin(30)
  54.         .textAlign(TextAlign.Center)
  55.         .backgroundColor(Color.Pink)
  56.         .visibility(this.visible)
  57.         .onDragStart(() => {                    //启动跨窗口拖拽
  58.           console.info('Text onDrag start')
  59.           return { pixelMap: this.pixelMapReader, extraInfo: 'custom extra info.' }
  60.         })
  61.         .onDrop((event: DragEvent, extraParams: string) => {
  62.           console.info('Text onDragDrop,  ')
  63.           this.visible = Visibility.None                    //拖动结束后,使源不可见
  64.         })
  65.     }
  66.     .width('100%')
  67.     .height('100%')
  68.   }
  69. }
复制代码
拖入窗体
  1. @Entry
  2. @Component
  3. struct Index {
  4.   @State number: string[] = ['drag here']
  5.   @State text: string = ''
  6.   @State bool1: boolean = false
  7.   @State bool2: boolean = false
  8.   @State visible: Visibility = Visibility.Visible
  9.   @State visible2: Visibility = Visibility.None
  10.   scroller: Scroller = new Scroller()
  11.   build() {
  12.     Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  13.       Text('App2')
  14.         .width('40%')
  15.         .height(80)
  16.         .fontSize(20)
  17.         .margin(30)
  18.         .textAlign(TextAlign.Center)
  19.         .backgroundColor(Color.Pink)
  20.         .visibility(Visibility.Visible)
  21.       List({ space: 20, initialIndex: 0 }) {
  22.         ForEach(this.number, (item) => {
  23.           ListItem() {
  24.             Text('' + item)
  25.               .width('100%')
  26.               .height(80)
  27.               .fontSize(16)
  28.               .borderRadius(10)
  29.               .textAlign(TextAlign.Center)
  30.               .backgroundColor(0xFFFFFF)
  31.           }
  32.         }, item => item)
  33.         ListItem() {
  34.           Text('Across Window Drag This')
  35.             .width('80%')
  36.             .height(80)
  37.             .fontSize(16)
  38.             .margin(30)
  39.             .textAlign(TextAlign.Center)
  40.             .backgroundColor(Color.Pink)
  41.             .visibility(this.visible2)
  42.         }
  43.       }
  44.       .height('50%')
  45.       .width('90%')
  46.       .border({ width: 1 })
  47.       .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 })
  48.       .onDragEnter((event: DragEvent, extraParams: string) => {                         //拖拽进去组件
  49.         console.info('List onDragEnter, ' + extraParams)
  50.       })
  51.       .onDragMove((event: DragEvent, extraParams: string) => {                          //拖拽时移动
  52.         console.info('List onDragMove, ' + extraParams)
  53.       })
  54.       .onDragLeave((event: DragEvent, extraParams: string) => {                         //拖拽离开组件
  55.         console.info('List onDragLeave, ' + extraParams)
  56.       })
  57.       .onDrop((event: DragEvent, extraParams: string) => {                              //释放组件
  58.         console.info('List onDragDrop, ' + extraParams)
  59.         this.visible2 = Visibility.Visible                                              //拖拽完成使拖入目标可见
  60.       })
  61.     }
  62.     .width('100%')
  63.     .height('100%')
  64.   }
  65. }
复制代码
因为不好演示就不截图了
3.触摸事件

触摸事件是一种用户与触摸屏或触摸设备举行交互的方式。当用户通过手指或手写笔触摸屏幕或其他触摸设备时,设备会检测到并触发相应的事件。触摸事件可以包括触摸开始、触摸移动、触摸结束、触摸取消等不同的操纵状态。
触摸事件常用于移动设备,例如智能手机、平板电脑等。通过触摸屏幕,用户可以举行滑动、点击、缩放等操纵,实现与设备的交互。
在软件开发中,可以通过监听触摸事件,来相应用户的触摸操纵。开发者可以根据触摸事件的不同状态,执行相应的操纵,例如在用户滑动屏幕时举行页面切换,大概在用户点击屏幕时举行按钮点击等。触摸事件的处理可以通过各种编程语言和开发框架来实现。
接口如下:
  1. onTouch(event: (event?: TouchEvent) => void)
复制代码


  • event.type为TouchType.Down:表示手指按下。
  • event.type为TouchType.Up:表示手指抬起。
  • event.type为TouchType.Move:表示手指按住移动。
案例如下:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct TouchExample {
  5.   @State text: string = '';
  6.   @State eventType: string = '';
  7.   build() {
  8.     Column() {
  9.       Button('Touch').height(40).width(100)
  10.         .onTouch((event: TouchEvent) => {
  11.           if (event.type === TouchType.Down) {
  12.             this.eventType = 'Down';
  13.           }
  14.           if (event.type === TouchType.Up) {
  15.             this.eventType = 'Up';
  16.           }
  17.           if (event.type === TouchType.Move) {
  18.             this.eventType = 'Move';
  19.           }
  20.           this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
  21.           + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
  22.           + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
  23.           + event.target.area.width + '\nheight:' + event.target.area.height
  24.         })
  25.       Button('Touch').height(50).width(200).margin(20)
  26.         .onTouch((event: TouchEvent) => {
  27.           if (event.type === TouchType.Down) {
  28.             this.eventType = 'Down';
  29.           }
  30.           if (event.type === TouchType.Up) {
  31.             this.eventType = 'Up';
  32.           }
  33.           if (event.type === TouchType.Move) {
  34.             this.eventType = 'Move';
  35.           }
  36.           this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
  37.           + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
  38.           + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
  39.           + event.target.area.width + '\nheight:' + event.target.area.height
  40.         })
  41.       Text(this.text)
  42.     }.width('100%').padding(30)
  43.   }
  44. }
复制代码

 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表