首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-02-22 03:40
  • 4474
  • 11983
blog.csdn.net

 前言

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

一、触屏事件

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

  1. 点击事件(Click Event):当用户在屏幕上单击时触发。开发者可以通过重写onTouch或onTouchEvent方法来监听并处理点击事件。在处理点击事件时,可以获取点击位置的坐标、点击的View等信息。

  2. 拖拽事件(Drag Event):当用户在屏幕上按住并拖动时触发。开发者可以通过重写onTouch或onTouchEvent方法来监听并处理拖拽事件。在处理拖拽事件时,可以获取当前拖拽的位置、起始位置、拖拽的View等信息。

  3. 触摸事件(Touch Event):触摸事件是一系列的事件,包括按下、抬起、移动等。开发者可以通过重写onTouch或onTouchEvent方法来监听并处理触摸事件。在处理触摸事件时,可以获取触摸的位置、触摸的View等信息。

除了重写onTouch或onTouchEvent方法来处理触摸事件外,开发者还可以使用View.OnTouchListener接口来监听和处理触摸事件。通过设置View的OnTouchListener,可以实现对触摸事件的更加灵活的控制和处理。

触摸事件原理:
在这里插入图片描述

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.触摸事件

触摸事件是一种用户与触摸屏或触摸设备进行交互的方式。当用户通过手指或手写笔触摸屏幕或其他触摸设备时,设备会检测到并触发相应的事件。触摸事件可以包括触摸开始、触摸移动、触摸结束、触摸取消等不同的操作状态。

触摸事件常用于移动设备,例如智能手机、平板电脑等。通过触摸屏幕,用户可以进行滑动、点击、缩放等操作,实现与设备的交互。

在软件开发中,可以通过监听触摸事件,来响应用户的触摸操作。开发者可以根据触摸事件的不同状态,执行相应的操作,例如在用户滑动屏幕时进行页面切换,或者在用户点击屏幕时进行按钮点击等。触摸事件的处理可以通过各种编程语言和开发框架来实现。

接口如下:

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. }

在这里插入图片描述

 ?写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing?,不定期分享原创知识。
  • 想要获取个人更多完整鸿蒙最新VIP学习资料,请点击→全套鸿蒙HarmonyOS学习资料
  • 或者关注小编后私信回复【666】也可获取资料哦~~

注:本文转载自blog.csdn.net的蜀道山QAQ的文章"https://blog.csdn.net/shudaoshanQAQ/article/details/135460871"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top