OpenHarmony开发者论坛
标题:
OpenHarmony应用组件自定义手势判定
[打印本页]
作者:
深开鸿_张守忠
时间:
2024-1-16 19:59
标题:
OpenHarmony应用组件自定义手势判定
[md]### 简介:
** 为组件绑定不同类型的手势事件,并设置事件的响应方法。 通过如下属性给组件绑定手势识别,手势识别成功后可以通过事件回调通知组件。 **
| **名称** | **参数类型** | **默认值** | **描述** |
| ------------------------- | -------------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **gesture** | **gesture: GestureType, mask?: GestureMask** | **gesture: -,mask: GestureMask.Normal** | **绑定手势。- gesture: 绑定的手势类型。 - mask: 事件响应设置。** |
| **priorityGesture** | **gesture: GestureType, mask?: GestureMask** | **gesture: -,mask: GestureMask.Normal** | **绑定优先识别手势。- gesture: 绑定的手势类型。- mask: 事件响应设置。1、默认情况下,子组件优先识别通过gesture绑定的手势,当父组件配置priorityGesture时,父组件优先识别priorityGesture绑定的手势。2、长按手势时,设置触发长按的最短时间小的组件会优先响应,会忽略priorityGesture设置。** |
| **parallelGesture** | **gesture: GestureType, mask?: GestureMask** | **gesture: -,mask: GestureMask.Normal** | **绑定可与子组件手势同时触发的手势。- gesture: 绑定的手势类型。 - mask: 事件响应设置。手势事件为非冒泡事件。父组件设置parallelGesture时,父子组件相同的手势事件都可以触发,实现类似冒泡效果。若父子组件中同时绑定单击手势事件和双击手势事件,则只响应单击手势事件。** |
### 文档环境:
* **开发环境:Windows 10专业版**
* **DevEco Studio版本:DevEco Studio 4.0Release (4.0.0.600)**
* **SDK版本:4.1.6.1 (full sdk)**
* **API版本:Version 11**
* **开发板型号:DAYU200(RK3568)**
* **系统版本:OpenHarmony 4.1.6.1**
### 演示demo:
* **新建一个 Stage 框架的 demo 工程,在page/Index.ets中通过两个stack组件分别封装colunm和text组件,其中上半部分背景色为蓝色,下半部分为黄色。**
* **上下两部分的stack分别绑定tap和longpress手势,通过属性onGestureJudgeBegin判定用户手势类型,对于上半部分只有在手势类型为longpress时通知上半部分的stack组件响应,而下半部分只有在手势类型为tap时通知下半部分stack组件响应。**
** demo运行效果:**
| **首页** | **长按蓝色区域** | **点击黄色区域** |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| ![image](file://D:/project/OpenHarmony_sample/sample_%E9%9C%80%E6%B1%82&%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1/custom_event/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%89%8B%E5%8A%BF%E5%88%A4%E5%AE%9A/screenshots/customGesture.jpeg?lastModify=1705406333) | ![image](file://D:/project/OpenHarmony_sample/sample_%E9%9C%80%E6%B1%82&%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1/custom_event/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%89%8B%E5%8A%BF%E5%88%A4%E5%AE%9A/screenshots/customGestureLongPress.jpeg?lastModify=1705406333) | ![image](file://D:/project/OpenHarmony_sample/sample_%E9%9C%80%E6%B1%82&%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1/custom_event/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%89%8B%E5%8A%BF%E5%88%A4%E5%AE%9A/screenshots/customGestureTap.jpeg?lastModify=1705406333) |
** 核心代码如下:**
```
import ShowToast from 'ShowToast';
@Entry
@Component
struct CustomJudgeEvent {
private btnFontColor: Resource = $r('app.color.white');
@State message: string = '';
build() {
Column() {
// 上半部分
Stack() {
Column() {
}
.height(340)
.width('100%')
.backgroundColor('#007DFF')
.opacity(0.1)
.alignItems(HorizontalAlign.Center)
.justifyContent(FlexAlign.Center)
.id('longPressColumn')
.border({
width: 1,
color: '#007DFF',
radius: { topLeft: 24, topRight: 24, bottomLeft: 0, bottomRight: 0 },
style: BorderStyle.Dotted
})
Text($r('app.string.custom_judge_long_press'))
.fontSize(16)
.fontWeight(400)
.fontFamily(' HarmonyHeiTi')
.textAlign(TextAlign.Center)
.opacity(0.7)
.fontColor('#007DFF')
.id('longPressPrompt')
}
.id('longPressArea')
.gesture(
TapGesture()
.tag("tap1")
)
.gesture(
LongPressGesture()
.tag("longPress1")
.onAction(() => {
this.message = 'longPress';
ShowToast.longToast($r('app.string.custom_long_press_prompt'));
})
)
.onGestureJudgeBegin((gestureInfo: GestureInfo, event: BaseGestureEvent) => {
// 自定义判定标准
if (gestureInfo.type == GestureControl.GestureType.LONG_PRESS_GESTURE &&
gestureInfo.tag == 'longPress1' &&
event.fingerList.length > 0 &&
event.fingerList[0].localY < 340) {
// 返回 CONTINUE 将保持系统判定。
return GestureJudgeResult.CONTINUE;
} else {
return GestureJudgeResult.REJECT;
}
})
// 下半部分
Stack() {
Column() {
}
.height(340)
.width('100%')
.backgroundColor('#F7CE00')
.opacity(0.1)
.alignItems(HorizontalAlign.Center)
.justifyContent(FlexAlign.Center)
.id('clickColumn')
.border({
width: 1,
color: '#F7BD00',
radius: { topLeft: 0, topRight: 0, bottomLeft: 24, bottomRight: 24 },
style: BorderStyle.Dotted
})
Text($r('app.string.custom_judge_click'))
.fontSize(16)
.fontWeight(400)
.fontFamily(' HarmonyHeiTi')
.textAlign(TextAlign.Center)
.fontColor('#FF9900')
.opacity(1)
.id('clickTextPrompt')
}
.id('clickArea')
.gesture(
TapGesture()
.tag("tap2")
.onAction(() => {
this.message = 'tap';
ShowToast.longToast($r('app.string.custom_tap_prompt'));
})
)
.gesture(
LongPressGesture()
.tag("longPress2")
.onAction(() => {
this.message = 'longPress'
})
)
.onGestureJudgeBegin((gestureInfo: GestureInfo, event: BaseGestureEvent) => {
// 自定义判定标准
if (gestureInfo.type == GestureControl.GestureType.TAP_GESTURE &&
gestureInfo.tag == 'tap2' &&
event.fingerList.length > 0 &&
event.fingerList[0].localY <= 340) {
// 返回 CONTINUE 将保持系统判定。
return GestureJudgeResult.CONTINUE;
} else {
return GestureJudgeResult.REJECT;
}
})
}
.height('100%')
.width('100%')
.padding({ left: 12, right: 12 })
.backgroundColor($r('app.color.background_shallow_grey'))
}
}
```
### sample仓地址:
**本功能的sample仓地址:**[
https://gitee.com/openharmony/applications
\_app\_samples/tree/master/code/UI/ArkTsComponentCollection/ComponentCollection](
https://gitee.com/openharmony/ap ... ComponentCollection
)
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5