HarmonyOS鸿蒙学习基础篇 - 通用事件_harmony onappear和ondisappear

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
img

正文

HarmonyOS鸿蒙是华为推出的分布式操作系统,旨在为各种智能设备提供统一的操作系统。鸿蒙系统的一大特色是其强大的分布式能力,而通用事件则是实现这一能力的关键技术之一,本篇博客将介绍HarmonyOS鸿蒙中的通用事件。

二、 点击事件

点击事件又称单击事件,是我们平时操作过程中触发的最多的事件,是组件被点击时触发的事件。

名称支持冒泡功能描述
onClick(event: (event?: ClickEvent) => void)点击动作触发该回调,event返回值见ClickEvent对象说明。 从API version 9开始,该接口支持在ArkTS卡片中使用。
ClickEvent对象说明

从API version 9开始,该接口支持在ArkTS卡片中使用。

名称类型描述
screenXnumber点击位置相对于应用窗口左上角的X坐标。
screenYnumber点击位置相对于应用窗口左上角的Y坐标。
xnumber点击位置相对于被点击元素左上角的X坐标。
ynumber点击位置相对于被点击元素左上角的Y坐标。
timestamp8+number事件时间戳。触发事件时距离系统启动的时间间隔,单位纳秒。
target8+EventTarget触发事件的元素对象显示区域。
source8+SourceType事件输入设备。
EventTarget8+对象说明
名称参数类型描述
areaArea目标元素的区域信息。
三、触摸事件

触摸事件是指在用户与触摸屏交互时发生的一系列事件

名称是否冒泡功能描述
onTouch(event: (event?: TouchEvent) => void)手指触摸动作触发该回调,event返回值见TouchEvent介绍。
TouchEvent对象说明
名称类型描述
typeTouchType触摸事件的类型。
touchesArray<TouchObject>全部手指信息。
changedTouchesArray<TouchObject>当前发生变化的手指信息。
stopPropagation() => void阻塞事件冒泡。
timestamp8+number事件时间戳。触发事件时距离系统启动的时间间隔,单位纳秒。 例如,当系统启动时间为2023/10/12 11:33, 在2023/10/12 11:34时触发触摸事件,时间戳返回的值为60,000,000,000ns。
target8+EventTarget触发事件的元素对象显示区域。
source8+SourceType事件输入设备。
TouchObject对象说明
名称类型描述
typeTouchType触摸事件的类型。
idnumber手指唯一标识符。
screenXnumber触摸点相对于应用窗口左上角的X坐标。
screenYnumber触摸点相对于应用窗口左上角的Y坐标。
xnumber触摸点相对于被触摸元素左上角的X坐标。
ynumber触摸点相对于被触摸元素左上角的Y坐标。
示例

// 使用 @Entry 装饰器表示这个组件是整个应用的主入口
// 使用 @Component 装饰器表示这个组件是 Flutter 应用的一部分
@Entry
@Component
struct TouchExample {
// 定义一个名为 text 的状态变量,类型为 string,初始值为空字符串
@State
text: string = ‘’

// 定义一个名为 eventType 的状态变量,类型为 string,初始值为空字符串
@State
eventType: string = ‘’

// build 方法是一个特殊的方法,在 Flutter 中用于构建和渲染组件
build() {
// Column 是一个垂直布局容器,用于放置其他组件
Column() {
// 第一个 Button 组件,高度为 40,宽度为 100
Button(‘Touch’).height(40).width(100)
// .onTouch 方法定义了当 Button 被触摸时触发的动作
.onTouch((event: TouchEvent) => {
// 根据触摸事件类型更新 eventType 状态变量
if (event.type === TouchType.Down) {
this.eventType = ‘Down’
} else if (event.type === TouchType.Up) {
this.eventType = ‘Up’
} else if (event.type === TouchType.Move) {
this.eventType = ‘Move’
}
// 更新 text 状态变量,显示触摸事件的详细信息
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 组件,高度为 50,宽度为 200,外边距为 20
    Button(‘Touch’).height(50).width(200).margin(20)
    // 与第一个 Button 组件的触摸事件处理相同
    .onTouch((event: TouchEvent) => {
    if (event.type === TouchType.Down) {
    this.eventType = ‘Down’
    } else if (event.type === TouchType.Up) {
    this.eventType = ‘Up’
    } else 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 组件显示 text 状态变量的值,即触摸事件的详细信息
    Text(this.text)
    // 设置 Column 的宽度为 ‘100%’,设置内边距为 30(用于增加布局间距)
    }.width(‘100%’).padding(30)
    } // build 方法结束,表示组件构建完成
    } // TouchExample 结构体定义结束

四、挂载卸载事件

挂载卸载事件指组件从组件树上挂载、卸载时触发的事件。

事件
名称支持冒泡功能描述
onAppear(event: () => void)组件挂载显示时触发此回调。 从API version 9开始,该接口支持在ArkTS卡片中使用。
onDisAppear(event: () => void)组件卸载消失时触发此回调。 从API version 9开始,该接口支持在ArkTS卡片中使用。
示例

// 导入ohos的promptAction模块,用于显示提示信息
import promptAction from ‘@ohos.promptAction’;

// 使用@Entry装饰器表示这个组件是整个应用的主入口
// 使用@Component装饰器表示这个组件是Flutter应用的一部分
@Entry
@Component
struct AppearExample {
// 定义一个名为isShow的状态变量,类型为boolean,初始值为true
@State
isShow: boolean = true;

// 定义一个名为changeAppear的状态变量,类型为string,初始值为’点我卸载挂载组件’
@State
changeAppear: string = ‘点我卸载挂载组件’;

// 定义一个私有变量myText,类型为string,初始值为’Text for onAppear’
private myText: string = ‘Text for onAppear’;

// build方法是一个特殊的方法,在Flutter中用于构建和渲染组件
build() {
// 创建一个Column垂直布局容器,用于放置其他组件
Column() {
// 创建一个Button组件,显示changeAppear变量的值
// 当点击这个按钮时,将触发onClick函数,切换isShow的值
Button(this.changeAppear)
.onClick(() => {
this.isShow = !this.isShow;
})
.margin(15); // 设置按钮的外边距为15
// 如果isShow为true,即显示下面的Text组件
if (this.isShow) {
// 创建一个Text组件,显示myText变量的值,字体大小为26,加粗
Text(this.myText).fontSize(26).fontWeight(FontWeight.Bold)
// 当这个Text组件首次显示时,触发onAppear函数,显示提示信息’The text is shown’
.onAppear(() => {
promptAction.showToast({
message: ‘The text is shown’,
duration: 2000 // 提示信息的显示时间为2000毫秒(2秒)
});
})
// 当这个Text组件被隐藏时,触发onDisAppear函数,显示提示信息’The text is hidden’
.onDisAppear(() => {
promptAction.showToast({
message: ‘The text is hidden’,
duration: 2000 // 提示信息的显示时间为2000毫秒(2秒)
});
});
} // if条件结束
} // Column组件结束
// 设置padding为30,设置宽度为100%,即占据整个屏幕宽度
.padding(30).width(‘100%’);
} // build方法结束,表示组件构建完成
} // AppearExample结构体定义结束

五、拖拽事件

拖拽事件指组件被长按后拖拽时触发的事件。

事件
名称支持冒泡功能描述
onDragStart(event: (event?: DragEvent, extraParams?: string) => CustomBuilderDragItemInfo)
onDragEnter(event: (event?: DragEvent, extraParams?: string) => void)拖拽进入组件范围内时,触发回调。 - event:拖拽事件信息,包括拖拽点坐标。 - extraParams:拖拽事件额外信息,详见extraParams说明。 当监听了onDrop事件时,此事件才有效。
onDragMove(event: (event?: DragEvent, extraParams?: string) => void)拖拽在组件范围内移动时,触发回调。 - event:拖拽事件信息,包括拖拽点坐标。 - extraParams:拖拽事件额外信息,详见extraParams说明。 当监听了onDrop事件时,此事件才有效。
onDragLeave(event: (event?: DragEvent, extraParams?: string) => void)拖拽离开组件范围内时,触发回调。 - event:拖拽事件信息,包括拖拽点坐标。 - extraParams:拖拽事件额外信息,详见extraParams说明。 当监听了onDrop事件时,此事件才有效。
onDrop(event: (event?: DragEvent, extraParams?: string) => void)绑定此事件的组件可作为拖拽释放目标,当在本组件范围内停止拖拽行为时,触发回调。 - event:拖拽事件信息,包括拖拽点坐标。 - extraParams:拖拽事件额外信息,详见extraParams说明。
DragItemInfo说明
名称类型必填描述
pixelMapPixelMap设置拖拽过程中显示的图片。
builderCustomBuilder拖拽过程中显示自定义组件,如果设置了pixelMap,则忽略此值。
extraInfostring拖拽项的描述。
extraParams说明

用于返回组件在拖拽中需要用到的额外信息。

extraParams是Json对象转换的string字符串,可以通过Json.parse转换的Json对象获取如下属性。

名称类型描述
selectedIndexnumber当拖拽事件设在父容器的子元素时,selectedIndex表示当前被拖拽子元素是父容器第selectedIndex个子元素,selectedIndex从0开始。 仅在ListItem组件的拖拽事件中生效。
insertIndexnumber当前拖拽元素在List组件中放下时,insertIndex表示被拖拽元素插入该组件的第insertIndex个位置,insertIndex从0开始。 仅在List组件的拖拽事件中生效。
DragEvent说明
名称类型描述
getX()number当前拖拽点相对于屏幕左上角的x轴坐标,单位为vp。
getY()number当前拖拽点相对于屏幕左上角的y轴坐标,单位为vp。
示例

// xxx.ets
@Extend(Text) function textStyle () {
.width(‘25%’)
.height(35)
.fontSize(16)
.textAlign(TextAlign.Center)
.backgroundColor(0xAFEEEE)
}

@Entry
@Component
struct DragExample {
@State numbers: string[] = [‘one’, ‘two’, ‘three’, ‘four’, ‘five’, ‘six’]
@State text: string = ‘’
@State bool: boolean = true
@State eventType: string = ‘’
@State appleVisible: Visibility = Visibility.Visible
@State orangeVisible: Visibility = Visibility.Visible
@State bananaVisible: Visibility = Visibility.Visible
private dragList: string[] = [‘apple’, ‘orange’, ‘banana’]
@State fruitVisible: Visibility[] = [Visibility.Visible, Visibility.Visible, Visibility.Visible]
@State idx: number = 0

// 自定义拖拽过程中显示的内容
@Builder pixelMapBuilder() {
Column() {
Text(this.text)
.width(‘50%’)
.height(60)
.fontSize(16)
.borderRadius(10)
.textAlign(TextAlign.Center)
.backgroundColor(Color.Yellow)
}
}

build() {
Column() {
Text(‘There are three Text elements here’)
.fontSize(12)
.fontColor(0xCCCCCC)
.width(‘90%’)
.textAlign(TextAlign.Start)
.margin(5)
Row({ space: 15 }) {
ForEach(this.dragList, (item, index) => {
Text(item)
.textStyle()
.visibility(this.fruitVisible[index])
.onDragStart(() => {
this.bool = true
this.text = item
this.fruitVisible[index] = Visibility.None
return this.pixelMapBuilder
})
.onTouch((event: TouchEvent) => {
if (event.type === TouchType.Down) {
this.eventType = ‘Down’
this.idx = index
}
if (event.type === TouchType.Up) {
this.eventType = ‘Up’
if (this.bool) {
this.fruitVisible[index] = Visibility.Visible
}
}
})
})
}.padding({ top: 10, bottom: 10 }).margin(10)

Text(‘This is a List element’)
.fontSize(12)
.fontColor(0xCCCCCC)
.width(‘90%’)
.textAlign(TextAlign.Start)
.margin(15)
List({ space: 20 }) {
ForEach(this.numbers, (item) => {
ListItem() {
Text(item)
.width(‘100%’)
.height(80)
.fontSize(16)
.borderRadius(10)
.textAlign(TextAlign.Center)
.backgroundColor(0xAFEEEE)
}
}, item => item)
}
.editMode(true)
.height(‘50%’)
.width(‘90%’)
.border({ width: 1 })
.padding(15)
.divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 })
.onDragEnter((event: DragEvent, extraParams: string) => {
console.log('List onDragEnter, ’ + extraParams + ‘X:’ + event.getX() + ‘Y:’ + event.getY())
})
.onDragMove((event: DragEvent, extraParams: string) => {
console.log('List onDragMove, ’ + extraParams + ‘X:’ + event.getX() + ‘Y:’ + event.getY())
})
.onDragLeave((event: DragEvent, extraParams: string) => {
console.log('List onDragLeave, ’ + extraParams + ‘X:’ + event.getX() + ‘Y:’ + event.getY())
})
.onDrop((event: DragEvent, extraParams: string) => {
let jsonString = JSON.parse(extraParams);
if (this.bool) {
// 通过splice方法插入元素
this.numbers.splice(jsonString.insertIndex, 0, this.text)
this.bool = false
}
this.fruitVisible[this.idx] = Visibility.None
})
}.width(‘100%’).height(‘100%’).padding({ top: 20 }).margin({ top: 20 })
}
}

六、按键事件

按键事件指组件与键盘、遥控器等按键设备交互时触发的事件,适用于所有可获焦组件,例如Button。对于Text,Image等默认不可获焦的组件,可以设置focusable属性为true后使用按键事件。

事件
名称支持冒泡功能描述
onKeyEvent(event: (event?: KeyEvent) => void)绑定该方法的组件获焦后,按键动作触发该回调,event返回值见KeyEvent介绍。
KeyEvent对象说明
名称类型描述
typeKeyType按键的类型。
keyCodenumber按键的键码。
keyTextstring按键的键值。
keySourceKeySource触发当前按键的输入设备类型。
deviceIdnumber触发当前按键的输入设备ID。
metaKeynumber按键发生时元键(即Windows键盘的WIN键、Mac键盘的Command键)的状态,1表示按压态,0表示未按压态。
timestampnumber事件时间戳。触发事件时距离系统启动的时间间隔,单位纳秒。
stopPropagation() => void阻塞事件冒泡传递。
示例

@Entry
@Component
struct KeyEventExample {
// 定义一个名为text的状态变量,类型为string,初始值为空字符串
@State
text: string = ‘’;

// 定义一个名为eventType的状态变量,类型为string,初始值为空字符串
@State
eventType: string = ‘’;

// build方法是一个特殊的方法,在Flutter中用于构建和渲染组件
build() {
// 创建一个Column垂直布局容器,用于放置其他组件
Column() {
// 创建一个Button组件,显示文字“KeyEvent”
Button(‘KeyEvent’)
// 当这个按钮接收到键盘事件时,触发onKeyEvent函数
.onKeyEvent((event: KeyEvent) => {
// 如果事件类型是按下(Down)
if (event.type === KeyType.Down) {
// 将eventType设置为’Down’
this.eventType = ‘Down’;
}
// 如果事件类型是释放(Up)
if (event.type === KeyType.Up) {
// 将eventType设置为’Up’
this.eventType = ‘Up’;
}
// 更新text的值,显示按键的类型、键码和键文
this.text = ‘KeyType:’ + this.eventType + ‘\nkeyCode:’ + event.keyCode + ‘\nkeyText:’ + event.keyText;
})
// 创建一个Text组件,显示text的值,并设置内边距为15像素
Text(this.text).padding(15)
// 设置Column的高度为300像素,宽度为100%,即全屏宽度,并设置外边距为35像素
}.height(300).width(‘100%’).padding(35);
}
}

七、焦点事件

焦点事件指页面焦点在可获焦组件间移动时触发的事件,组件可使用焦点事件来处理相关逻辑。

  • 从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
  • 目前仅支持通过外接键盘的tab键、方向键触发。
  • 存在默认交互逻辑的组件例如Button、TextInput等,默认即为可获焦,Text、Image等组件则默认状态为不可获焦,不可获焦状态下,无法触发焦点事件,需要设置focusable属性为true才可触发。
事件
名称支持冒泡功能描述
onFocus(event: () => void)当前组件获取焦点时触发的回调。
onBlur(event:() => void)当前组件失去焦点时触发的回调。
示例

@Entry
@Component
struct FocusEventExample {
// 定义三个状态变量,分别表示三个按钮的颜色
@State
oneButtonColor: string = ‘#FFC0CB’;

@State
twoButtonColor: string = ‘#87CEFA’;

@State
threeButtonColor: string = ‘#90EE90’;

build() {
// 创建一个Column垂直布局容器,并设置外边距为20像素
Column({ space: 20 }) {
// 创建一个名为“First Button”的按钮,设置背景颜色为oneButtonColor,宽度为260像素,高度为70像素,字体颜色为黑色,可获取焦点

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

定义三个状态变量,分别表示三个按钮的颜色
@State
oneButtonColor: string = ‘#FFC0CB’;

@State
twoButtonColor: string = ‘#87CEFA’;

@State
threeButtonColor: string = ‘#90EE90’;

build() {
// 创建一个Column垂直布局容器,并设置外边距为20像素
Column({ space: 20 }) {
// 创建一个名为“First Button”的按钮,设置背景颜色为oneButtonColor,宽度为260像素,高度为70像素,字体颜色为黑色,可获取焦点

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-BlEzh2Jd-1713296222238)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值