From 7ede18a4d7883930326f0a955d95c61c24a7050d Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Wed, 23 Apr 2025 21:19:59 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangweiyuan --- .../ArkUISample/EventProject/README_zh.md | 1 + .../EventProject/build-profile.json5 | 3 +- .../entry/src/main/ets/pages/device/OnKey.ets | 4 ++ .../src/main/ets/pages/device/OnMouse.ets | 3 + .../pages/gesturejudge/GestureTriggered.ets | 72 +++++++++++++++++++ .../src/main/ets/pages/gesturejudge/Index.ets | 7 ++ .../main/resources/base/element/string.json | 13 ++++ 7 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/gesturejudge/GestureTriggered.ets diff --git a/code/DocsSample/ArkUISample/EventProject/README_zh.md b/code/DocsSample/ArkUISample/EventProject/README_zh.md index 12849e3d3d..8c1df629bc 100644 --- a/code/DocsSample/ArkUISample/EventProject/README_zh.md +++ b/code/DocsSample/ArkUISample/EventProject/README_zh.md @@ -56,6 +56,7 @@ entry/src/main/ets/ | |---gesturejudge //手势拦截 | | |---Index.ets | | |---GestureJudge.ets +| | |---GestureTriggered.ets | |---singlegesture //单一手势 | | |---LongPressGesture.ets | | |---PanGesture.ets diff --git a/code/DocsSample/ArkUISample/EventProject/build-profile.json5 b/code/DocsSample/ArkUISample/EventProject/build-profile.json5 index 678ab565d6..9a067264a4 100644 --- a/code/DocsSample/ArkUISample/EventProject/build-profile.json5 +++ b/code/DocsSample/ArkUISample/EventProject/build-profile.json5 @@ -15,8 +15,7 @@ { "app": { - "signingConfigs": [ - ], + "signingConfigs": [], "products": [ { "name": "default", diff --git a/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/device/OnKey.ets b/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/device/OnKey.ets index 785cf406e0..d7892e634a 100644 --- a/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/device/OnKey.ets +++ b/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/device/OnKey.ets @@ -31,6 +31,10 @@ export struct OnKey { .width(140).height(70) .onKeyEvent((event?: KeyEvent) => { // 给Button设置onKeyEvent事件 if(event){ + // 通过stopPropagation阻止事件冒泡 + if(event.stopPropagation){ + event.stopPropagation(); + } if (event.type === KeyType.Down) { this.buttonType = 'Down'; } diff --git a/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/device/OnMouse.ets b/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/device/OnMouse.ets index 209e6c5843..97628406d5 100644 --- a/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/device/OnMouse.ets +++ b/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/device/OnMouse.ets @@ -41,6 +41,9 @@ export struct Mouse { }) .onMouse((event?: MouseEvent) => { // 设置Button的onMouse回调 if (event) { + if (event.stopPropagation) { + event.stopPropagation();// 在Button的onMouse事件中设置阻止冒泡 + } this.buttonText = 'Button onMouse:\n' + '' + 'button = ' + event.button + '\n' + 'action = ' + event.action + '\n' + diff --git a/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/gesturejudge/GestureTriggered.ets b/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/gesturejudge/GestureTriggered.ets new file mode 100644 index 0000000000..78e57ed0d0 --- /dev/null +++ b/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/gesturejudge/GestureTriggered.ets @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { promptAction } from '@kit.ArkUI'; + +@Entry +@Component +export struct GestureTriggered { + scroller: Scroller = new Scroller(); + + build() { + NavDestination() { + Scroll(this.scroller) { + Column({ space: 8 }) { + Text('包括上下两层组件,上层组件绑定长按手势,下层组件绑定拖拽。其中上层组件下半区域绑定手势拦截,使该区域响应下层拖拽手势。') + .width('100%') + .fontSize(20) + .fontColor('0xffdd00') + Stack({ alignContent: Alignment.Center }) { + Column() { + // 模拟上半区和下半区 + Stack().width('200vp').height('100vp').backgroundColor(Color.Red) + Stack().width('200vp').height('100vp').backgroundColor(Color.Blue) + }.width('200vp').height('200vp') + // Stack的下半区是绑定了拖动手势的图像区域。 + Image($r('sys.media.ohos_app_icon')) + .draggable(true) + .onDragStart(() => { + promptAction.showToast({ message: 'Drag 下半区蓝色区域,Image响应' }); + }) + .width('200vp').height('200vp') + // Stack的上半区是绑定了长按手势的浮动区域。 + Stack() { + } + .width('200vp') + .height('200vp') + .hitTestBehavior(HitTestMode.Transparent) + .gesture(GestureGroup(GestureMode.Parallel, + LongPressGesture() + .onAction((event: GestureEvent) => { + promptAction.showToast({ message: 'LongPressGesture 长按上半区 红色区域,红色区域响应' }); + }) + .tag('LongPress') + )) + .onGestureJudgeBegin((gestureInfo: GestureInfo, event: BaseGestureEvent) => { + // 如果是长按类型手势,判断点击的位置是否在上半区 + if (gestureInfo.type == GestureControl.GestureType.LONG_PRESS_GESTURE) { + if (event.fingerList.length > 0 && event.fingerList[0].localY < 100) { + return GestureJudgeResult.CONTINUE; + } else { + return GestureJudgeResult.REJECT; + } + } + return GestureJudgeResult.CONTINUE; + }) + }.width('100%') + }.width('100%') + } + } + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/gesturejudge/Index.ets b/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/gesturejudge/Index.ets index b63a44b1a7..1014868879 100644 --- a/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/gesturejudge/Index.ets +++ b/code/DocsSample/ArkUISample/EventProject/entry/src/main/ets/pages/gesturejudge/Index.ets @@ -16,6 +16,7 @@ import { CompletedRoutableCard } from '../../common/Card'; import { Route } from '../../common/Route'; import { GestureJudge } from './GestureJudge'; +import { GestureTriggered } from './GestureTriggered'; import resource from '../../common/resource'; @@ -26,6 +27,10 @@ const routes: Route[] = [ name: `${GestureJudge_ROUTE_PREFIX}/GestureJudge`, title: resource.resourceToString($r('app.string.gesture_Index_GestureJudge_title')), description: resource.resourceToString($r('app.string.gesture_Index_GestureJudge_description')), + },{ + name: `${GestureJudge_ROUTE_PREFIX}/GestureTriggered`, + title: resource.resourceToString($r('app.string.gesture_GestureTriggered_title')), + description: resource.resourceToString($r('app.string.gesture_GestureTriggered_description')), } ] @@ -35,6 +40,8 @@ export function GestureJudgeDestination(name: string) { GestureJudgeExample(); } else if (name === routes[0].name) { GestureJudge(); + }else if (name === routes[1].name) { + GestureTriggered(); } } diff --git a/code/DocsSample/ArkUISample/EventProject/entry/src/main/resources/base/element/string.json b/code/DocsSample/ArkUISample/EventProject/entry/src/main/resources/base/element/string.json index 145f10cab5..be7d619218 100644 --- a/code/DocsSample/ArkUISample/EventProject/entry/src/main/resources/base/element/string.json +++ b/code/DocsSample/ArkUISample/EventProject/entry/src/main/resources/base/element/string.json @@ -415,6 +415,19 @@ { "name": "Pages_Index_DragEvent", "value": "拖拽事件/DragEvent" + }, + { + "name": "gesture_GestureTriggered_description", + "value": "手势触发控制是指,在系统判定阈值已满足的条件下,应用可自行判断是否应拦截手势,使手势操作失败。" + }, + { + "name": "gesture_GestureTriggered_title", + "value": "手势触发控制" + }, + + { + "name": "Pages_Index_GestureTriggered", + "value": "手势触发控制/GestureTriggered" } ] } \ No newline at end of file -- Gitee From 4d674400fb03f923e4e63225b64e68efd1ab94b4 Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Thu, 24 Apr 2025 14:53:36 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entry/src/ohosTest/ets/test/Index.test.ets | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/code/DocsSample/ArkUISample/EventProject/entry/src/ohosTest/ets/test/Index.test.ets b/code/DocsSample/ArkUISample/EventProject/entry/src/ohosTest/ets/test/Index.test.ets index 058602118e..a33eb62855 100644 --- a/code/DocsSample/ArkUISample/EventProject/entry/src/ohosTest/ets/test/Index.test.ets +++ b/code/DocsSample/ArkUISample/EventProject/entry/src/ohosTest/ets/test/Index.test.ets @@ -56,7 +56,6 @@ export default function IndexTest() { //已进入测试界面 let button2 = await driver.findComponent(ON.text('twice', MatchPattern.CONTAINS)); await button2.doubleClick(); - await sleep(1000); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testSingleGestureTap end'); @@ -79,7 +78,6 @@ export default function IndexTest() { //已进入测试界面 let button2 = await driver.findComponent(ON.text('Long', MatchPattern.CONTAINS)); await button2.longClick(); - await sleep(1000); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testSingleGestureLong end'); @@ -100,7 +98,6 @@ export default function IndexTest() { let button_list1 = await driver.findComponent(ON.text(resource.resourceToString($r('app.string.gesture_Index_GestureJudge_title')), MatchPattern.CONTAINS)); await button_list1.click(); //已进入测试界面 - await sleep(1000); await driver.pressBack(); console.info('uitest: testSingleGestureJudge end'); done(); @@ -115,14 +112,7 @@ export default function IndexTest() { console.info('uitest: testSingleGestureTouch begin'); let driver = Driver.create(); let button_list = await driver.findComponent(ON.text('TouchEvent', MatchPattern.CONTAINS)); - expect(button_list === null).assertFalse(); - await button_list.click(); - let button_list1 = await driver.findComponent(ON.text(resource.resourceToString($r('app.string.Touch_Index_ClickEvent_title')), MatchPattern.CONTAINS)); - await button_list1.click(); - //已进入测试界面 - let button = await driver.findComponent(ON.text('show', MatchPattern.CONTAINS)); - await button.click(); - await sleep(1000); + expect(button_list === null).assertTrue(); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testSingleGestureTouch end'); -- Gitee