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

img
img

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

需要这份系统化的资料的朋友,可以戳这里获取

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

.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像素,字体颜色为黑色,可获取焦点
Button(‘First Button’)
.backgroundColor(this.oneButtonColor)
.width(260)
.height(70)
.fontColor(Color.Black)
.focusable(true)
// 当按钮获得焦点时,将oneButtonColor设置为红色
.onFocus(() => {
this.oneButtonColor = ‘#FF0000’;
})
// 当按钮失去焦点时,将oneButtonColor设置回原来的颜色(#FFC0CB)
.onBlur(() => {
this.oneButtonColor = ‘#FFC0CB’;
});
// 创建一个名为“Second Button”的按钮,设置背景颜色为twoButtonColor,宽度为260像素,高度为70像素,字体颜色为黑色,可获取焦点
Button(‘Second Button’)
.backgroundColor(this.twoButtonColor)
.width(260)
.height(70)
.fontColor(Color.Black)
.focusable(true)
// 当按钮获得焦点时,将twoButtonColor设置为红色
.onFocus(() => {
this.twoButtonColor = ‘#FF0000’;
})
// 当按钮失去焦点时,将twoButtonColor设置回原来的颜色(#87CEFA)
.onBlur(() => {
this.twoButtonColor = ‘#87CEFA’;
});
// 创建一个名为“Third Button”的按钮,设置背景颜色为threeButtonColor,宽度为260像素,高度为70像素,字体颜色为黑色,可获取焦点
Button(‘Third Button’)
.backgroundColor(this.threeButtonColor)
.width(260)
.height(70)
.fontColor(Color.Black)
.focusable(true)
// 当按钮获得焦点时,将threeButtonColor设置为红色
.onFocus(() => {
this.threeButtonColor = ‘#FF0000’;
})
// 当按钮失去焦点时,将threeButtonColor设置回原来的颜色(#90EE90)
.onBlur(() => {
this.threeButtonColor = ‘#90EE90’;
});
}
}
}

八、鼠标事件

在鼠标的单个动作触发多个事件时,事件的顺序是固定的,鼠标事件默认透传。

  • 从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
  • 目前仅支持通过外接鼠标触发。
事件
名称支持冒泡描述
onHover(event: (isHover?: boolean) => void)鼠标进入或退出组件时触发该回调。 isHover:表示鼠标是否悬浮在组件上,鼠标进入时为true, 退出时为false。
onMouse(event: (event?: MouseEvent) => void)当前组件被鼠标按键点击时或者鼠标在组件上悬浮移动时,触发该回调,event返回值包含触发事件时的时间戳、鼠标按键、动作、鼠标位置在整个屏幕上的坐标和相对于当前组件的坐标。
MouseEvent对象说明
名称属性类型描述
screenXnumber鼠标位置相对于应用窗口左上角的x轴坐标。
screenYnumber鼠标位置相对于应用窗口左上角的y轴坐标。
xnumber鼠标位置相对于当前组件左上角的x轴坐标。
ynumber鼠标位置相对于当前组件左上角的y轴坐标。
buttonMouseButton鼠标按键。
actionMouseAction鼠标动作。
stopPropagation() => void阻塞事件冒泡。
timestamp8+number事件时间戳。触发事件时距离系统启动的时间间隔,单位纳秒。
target8+EventTarget触发事件的元素对象显示区域。
source8+SourceType事件输入设备。
示例

@Entry
@Component
struct MouseEventExample {
@State hoverText: string = ‘no hover’;
@State mouseText: string = ‘’;
@State action: string = ‘’;
@State mouseBtn: string = ‘’;
@State color: Color = Color.Blue;

build() {
Column({ space: 20 }) {
Button(this.hoverText)
.width(180).height(80)
.backgroundColor(this.color)
.onHover((isHover: boolean) => {
// 通过onHover事件动态修改按钮在是否有鼠标悬浮时的文本内容与背景颜色
if (isHover) {
this.hoverText = ‘hover’;
this.color = Color.Pink;
} else {
this.hoverText = ‘no hover’;
this.color = Color.Blue;
}
})
Button(‘onMouse’)
.width(180).height(80)
.onMouse((event: MouseEvent) => {
switch (event.button) {
case MouseButton.None:
this.mouseBtn = ‘None’;
break;
case MouseButton.Left:
this.mouseBtn = ‘Left’;
break;
case MouseButton.Right:
this.mouseBtn = ‘Right’;
break;
case MouseButton.Back:
this.mouseBtn = ‘Back’;
break;
case MouseButton.Forward:
this.mouseBtn = ‘Forward’;
break;
case MouseButton.Middle:
this.mouseBtn = ‘Middle’;
break;
}
switch (event.action) {
case MouseAction.Hover:
this.action = ‘Hover’;
break;
case MouseAction.Press:
this.action = ‘Press’;
break;
case MouseAction.Move:
this.action = ‘Move’;
break;
case MouseAction.Release:
this.action = ‘Release’;
break;
}
this.mouseText = 'onMouse:\nButton = ’ + this.mouseBtn +
'\nAction = ’ + this.action + ‘\nXY=(’ + event.x + ‘,’ + event.y + ‘)’ +
‘\nscreenXY=(’ + event.screenX + ‘,’ + event.screenY + ‘)’;
})
Text(this.mouseText)
}.padding({ top: 30 }).width(‘100%’)
}
}

鼠标悬浮时改变文本内容与背景颜色:

鼠标点击时:

九、组件区域变化事件

组件区域变化事件指组件显示的尺寸、位置等发生变化时触发的事件。

事件
名称支持冒泡功能描述
onAreaChange(event: (oldValue: Area, newValue: Area) => void)组件区域变化时触发该回调。仅会响应由布局变化所导致的组件大小、位置发生变化时的回调。由绘制变化所导致的渲染属性变化不会响应回调,如translate、offset。 - Area:返回目标元素的宽高以及目标元素相对父元素和页面左上角的坐标位置。
示例

@Entry
@Component
struct AreaExample {
// 定义一个状态变量value,初始值为’Text’
@State
value: string = ‘Text’;

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

build() {
// 创建一个Column垂直布局容器
Column() {
// 创建一个Text组件,显示当前value的值,背景颜色为绿色,外边距为30像素,字体大小为20像素
Text(this.value)
.backgroundColor(Color.Green).margin(30).fontSize(20)
// 当Text组件被点击时,将value的值追加’Text’
.onClick(() => {
this.value = this.value + ‘Text’;
})
// 当Text组件的面积发生变化时,打印出变化前后的面积值到控制台,并将变化后的面积值赋给sizeValue
.onAreaChange((oldValue: Area, newValue: Area) => {
console.info(Ace: on area change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)});

img
img

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

需要这份系统化的资料的朋友,可以戳这里获取

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

this.value + ‘Text’;
})
// 当Text组件的面积发生变化时,打印出变化前后的面积值到控制台,并将变化后的面积值赋给sizeValue
.onAreaChange((oldValue: Area, newValue: Area) => {
console.info(Ace: on area change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)});

[外链图片转存中…(img-gmdYAfWs-1715817506856)]
[外链图片转存中…(img-ZRILyXKp-1715817506856)]

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

需要这份系统化的资料的朋友,可以戳这里获取

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值