开天辟地 HarmonyOS(鸿蒙) - 输入: 触摸类输入

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

开天辟地 HarmonyOS(鸿蒙) - 输入: 触摸类输入

示例如下:

pages\input\TouchDemo.ets

/** 触摸类输入* 点击事件,触摸事件,拖拽事件,事件冒泡,事件透传*/import { TitleBar } from '../TitleBar';
import { unifiedDataChannel, uniformTypeDescriptor } from '@kit.ArkData';@Entry
@Component
struct TouchDemo {build() {Column() {TitleBar()Tabs() {TabContent() { MySample1() }.tabBar('点击事件').align(Alignment.Top)TabContent() { MySample2() }.tabBar('触摸事件').align(Alignment.Top)TabContent() { MySample3() }.tabBar('拖拽事件').align(Alignment.Top)TabContent() { MySample4() }.tabBar('事件冒泡').align(Alignment.Top)TabContent() { MySample5() }.tabBar('事件透传').align(Alignment.Top)}.scrollable(true).barMode(BarMode.Scrollable).layoutWeight(1)}}
}@Component
struct MySample1 {@State message: string = ""build() {Column({ space: 10 }) {Text(this.message)/** onClick() - 点击事件,当按下并抬起后触发(回调参数是一个 ClickEvent 对象)*   x, y - 点击位置相对于组件左上角的坐标*   windowX, windowY - 点击位置相对于窗口的坐标*   displayX, displayY - 点击位置相对于屏幕的坐标*   timestamp - 事件触发时,距系统启动时的时间戳*   target.area - 触发了事件的组件的显示区域(一个 Area 对象)*     width, height - 尺寸*     position - 区域的左上角相对于父容器的左上角的位置*     globalPosition - 区域的左上角相对于页面的左上角的位置*/Button('click me').onClick((event: ClickEvent) => {this.message = "onClick\n"this.message += `x:${event.x}\n`this.message += `y:${event.y}\n`this.message += `windowX:${event.windowX}\n`this.message += `windowY:${event.windowY}\n`this.message += `displayX:${event.displayX}\n`this.message += `displayY:${event.displayY}\n`this.message += `timestamp:${event.timestamp}\n`this.message += `target area width:${event.target.area.width}\n`this.message += `target area height:${event.target.area.height}\n`this.message += `target area position:${JSON.stringify(event.target.area.position)}\n`this.message += `target area globalPosition:${JSON.stringify(event.target.area.globalPosition)}\n`})}}
}@Component
struct MySample2 {@State message: string = ""build() {Column({ space: 10 }) {Text(this.message)/** onTouch() - 触摸事件,当按下或滑动或抬起时触发(回调参数是一个 TouchEvent 对象)*   type - 触摸的类型(TouchEvent 枚举)*     Down, Up, Move*   touches - 当前全部的触摸点的信息(一个 TouchObject 对象数组)*   changedTouches - 当前发生变化的触摸点的信息(一个 TouchObject 对象数组)** TouchObject - 触摸点信息*   x, y - 触摸点的位置相对于组件左上角的坐标*   windowX, windowY - 触摸点的位置相对于窗口的坐标*   displayX, displayY - 触摸点的位置相对于屏幕的坐标*   timestamp - 事件触发时,距系统启动时的时间戳*   target.area - 触发了事件的组件的显示区域(一个 Area 对象)*     width, height - 尺寸*     position - 区域的左上角相对于父容器的左上角的位置*     globalPosition - 区域的左上角相对于页面的左上角的位置*/Button('click me').onTouch((event: TouchEvent) => {let touches = event.toucheslet changedTouches = event.changedTouchesthis.message = "onTouch\n"this.message += `type:${TouchType[event.type]}\n`this.message += `x:${touches[0].x}\n`this.message += `y:${touches[0].y}\n`this.message += `windowX:${touches[0].windowX}\n`this.message += `windowY:${touches[0].windowY}\n`this.message += `displayX:${touches[0].displayX}\n`this.message += `displayY:${touches[0].displayY}\n`this.message += `timestamp:${event.timestamp}\n`this.message += `target area width:${event.target.area.width}\n`this.message += `target area height:${event.target.area.height}\n`this.message += `target area position:${JSON.stringify(event.target.area.position)}\n`this.message += `target area globalPosition:${JSON.stringify(event.target.area.globalPosition)}\n`})}}
}@Component
struct MySample3 {@State message: string = ""@State targetText: string = ""@State targetImage: string = ""build() {Column({space:10}) {Text(this.message)/** draggable() - 是否支持按下后的拖拽操作* allowDrop() - 当拖拽组件落入当前组件时,指定允许传递的数据类型(一个 UniformDataType 枚举数组)*   PLAIN_TEXT, IMAGE, 等** onDragStart() - 拖拽开始时的回调(当长按时间大于 500 毫秒,且拖拽距离大于 10vp 时触发回调)* onPreDrag() - 拖拽发起前的回调* onDragEnd() - 拖拽完成后的回调** onDrop() - 当拖拽组件在当前组件释放时的回调* onDragEnter(), onDragMove(), onDragLeave() - 当拖拽组件进入当前组件,在当前组件上移动,离开当前组件时的回调(当监听了 onDrop() 时才会生效)*/Text('text').border({ color: Color.Black, width: 1 }).width('100%').height(100).draggable(true).onDragStart((event: DragEvent) => {this.message = `onDragStart`// 设置 PlainText 类型的拖拽数据let data: unifiedDataChannel.PlainText = new unifiedDataChannel.PlainText();data.textContent = 'textContent';event.setData(new unifiedDataChannel.UnifiedData(data));}).onPreDrag((status: PreDragStatus) => {this.message = `onPreDrag:${status}`}).onDragEnd((event: DragEvent) => {// 通过 event.getResult() 获取 drop 的结果(即在 onDrop() 中通过 event.setResult() 设置的结果)this.message = `onDragEnd:${DragResult[event.getResult()]}`})Text(this.targetText).border({ color: Color.Black, width: 1 }).width('100%').height(100).allowDrop([uniformTypeDescriptor.UniformDataType.PLAIN_TEXT]).onDrop((event: DragEvent) => {let data: UnifiedData = event.getData();if (!data) {return;}let records: Array<unifiedDataChannel.UnifiedRecord> = data.getRecords();if (!records || records.length <= 0) {return;}// 获取 PlainText 类型的拖拽数据let plainText: unifiedDataChannel.PlainText = records[0] as unifiedDataChannel.PlainText;this.targetText = plainText.textContent;// 设置 drop 的结果event.setResult(DragResult.DRAG_SUCCESSFUL);}).onDragEnter((event: DragEvent) => {this.message = `onDragEnter`}).onDragMove((event: DragEvent) => {this.message = `onDragMove`}).onDragLeave((event: DragEvent) => {this.message = `onDragLeave`})Image($r('app.media.app_icon')).width(100).height(100).draggable(true).onDragEnd((event: DragEvent) => {// 通过 event.getResult() 获取 drop 的结果(即在 onDrop() 中通过 event.setResult() 设置的结果)this.message = `onDragEnd:${DragResult[event.getResult()]}`})Image(this.targetImage).width(100).height(100).border({ color: Color.Black, width: 1 }).allowDrop([uniformTypeDescriptor.UniformDataType.IMAGE]).onDrop((event: DragEvent) => {let data: UnifiedData = event.getData();if (!data) {return;}let records: Array<unifiedDataChannel.UnifiedRecord> = data.getRecords();if (!records || records.length <= 0) {return;}// 获取拖拽的图片的地址this.targetImage = (records[0] as unifiedDataChannel.Image).imageUri;// 设置 drop 的结果event.setResult(DragResult.DRAG_SUCCESSFUL);})}}
}@Component
struct MySample4 {@State message: string = ""build() {Column({space:10}) {Text(this.message)/** 父子组件场景下* onTouch() 事件默认是支持冒泡的,如果不需要冒泡则调用 event.stopPropagation() 即可*/Column() {Column() {Column() {}.width(100).height(100).backgroundColor(Color.Red).onTouch(() => {this.message += "r"})}.width(200).height(200).backgroundColor(Color.Green).onTouch(() => {this.message += "g"})}.width(300).height(300).backgroundColor(Color.Blue).onTouch(() => {this.message += "b"})Column() {Column() {Column() {}.width(100).height(100).backgroundColor(Color.Red).onTouch((event: TouchEvent) => {event.stopPropagation()this.message += "r"})}.width(200).height(200).backgroundColor(Color.Green).onTouch((event: TouchEvent) => {event.stopPropagation()this.message += "g"})}.width(300).height(300).backgroundColor(Color.Blue).onTouch((event: TouchEvent) => {event.stopPropagation()this.message += "b"})}}
}@Component
struct MySample5 {@State message: string = ""build() {Column({space:10}) {Text(this.message)/** 兄弟组件场景下* onTouch() 事件默认是不支持透传的,如果需要透传则调用 hitTestBehavior(HitTestMode.Transparent) 即可*/Stack() {Column().width(300).height(300).backgroundColor(Color.Blue).onTouch(() => {this.message += "b"})Column().width(200).height(200).backgroundColor(Color.Green).onTouch(() => {this.message += "g"})Column().width(100).height(100).backgroundColor(Color.Red).onTouch(() => {this.message += "r"})}.width(300).height(300)Stack() {Column().width(300).height(300).backgroundColor(Color.Blue).onTouch(() => {this.message += "b"}).hitTestBehavior(HitTestMode.Transparent)Column().width(200).height(200).backgroundColor(Color.Green).onTouch(() => {this.message += "g"}).hitTestBehavior(HitTestMode.Transparent)Column().width(100).height(100).backgroundColor(Color.Red).onTouch(() => {this.message += "r"}).hitTestBehavior(HitTestMode.Transparent)}.width(300).height(300)}}
}

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day20 yum的详细的讲述

day20 yum的精讲 yum是centos 7中很重要的工具需要我们去了解和学习 1.学习的任务和背景 一般开发团队需要数据库的环境来测试程序 现在需要运维人员来协助在测试机器上Centos7上安装好 MySQL-5.6.43版本来作为前期迁移的准备的工作 同时== 配备好本地的yum源==方便后续软件包的…

Active Directory审核的常见误区(3)

一、忽略过时、未激活和孤立的用户帐户 存在未使用的用户帐户在AD域中是一个重大的安全隐患。离职员工和黑客可能会因此漏洞而去窃取企业的重要资源。这时候,制定处理离职员工的策略就显得至关重要,这包括禁用他的AD用户帐户、将他从电子邮件组中删除、撤销他对业务应用程序的…

java.net.UnknownHostException: upload-as0.qiniup.com: Name or service not known on问题排查

参考地址:https://blog.csdn.net/weixin_43700340/article/details/88393833 ping upload-as0.qiniup.com还有百度不通,但是局域网可以ping通ping网关可以ping通,ping公共地址也可以ping通如果直接ping百度的ip是可以通的通过上面的博客知道应该是DSN出了问题 也试过了这个命…

Java使用Amazon S3客户端实现前后端联动文件分片上传

在使用对象存储的时候,遇到超大文件上传的应用场景,可以通过前后端联动的方式,实现超大文件从前端直接向对象存储服务进行分片上传,具体实现过程如下: Maven依赖: <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</art…

IOMMU和IOVA

IOMMU和IOVA 默认情况下,任何硬件都可以访问整个系统,因此它可以在任何地方执行DMA 事务。这有许多安全隐患。例如,流氓和/或不可信进程(包括在VM (虚拟机)内运行的进程)可能使用硬件设备来读写内核空间,和几乎其他任何存储位置。为了解决这个问题,现代系统配备了输入输出…

linux无法连接宿主机网络问题

很奇怪,之前我是可以连接宿主机互联网的,突然有一天不行了, 没找到具体的原因, 网上找了一下怎么解决,网络就又好了, 先记录一下,有时间在研究。 1、在虚拟机中创建的“电脑”上,右键选则setting(设置)。 2、选择NAT模式,然后点击Edit--》virtual network editor,点…

Node.js 路由

我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。 因此,我们需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST 参数。这一功能应当属于路由还是服务器(甚至作为一个模块自身的功能)? 我们需要的所有数据都会…

SageMath 9.3软件下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【051】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件)双击解压安装包安装,弹窗安装对话框点击下一步选择I accept,点击下一步默认,点击下一步默认文件夹,点击下一步安装路径选择D盘,点…

GoLand 2024软件下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【048】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件)下载并解压压缩包,双击exe文件安装,弹窗安装对话框点击下一步创建桌面快捷方式,点击下一步默认,点击安装等待安装过程运行软件,点…

VisualStudio快速更改方法签名

右键——快速操作和重构 更改方法签名 更改签名中,即可进行添加或删除 *****有道无术,术尚可求;有术无道,止于术。*****

eclipse xml Indent using spaces not work /eclipse xml 使用空格缩进功能未生效问题解决

eclipse xml Indent using spaces not work eclipse xml 使用空格缩进功能未生效问题解决 设置xml格式化配置Line width: 设置每行宽度Line width设定为80到100个字符。 Split multiple attributes each on a new line: 标签的每个属性都单独一行显示 Preserve whitespace in t…

【多线程】AQS详解

AQS是什么 AbstractQueuedSynchronizer是一个抽象的队列同步器,AQS利用模板方法模式解决了开发者在实现同步器时的复杂问题,提供了一个通用的加锁解锁框架。 AQS执行原理 AQS为实现的同步器提供了通用的执行框架,定义了对资源state的获取和释放流程。AQS核心思想是在CLH锁的…