diff --git a/code/DocsSample/ArkUISample/EventProject/README_zh.md b/code/DocsSample/ArkUISample/EventProject/README_zh.md index 12849e3d3dce6fdb005b7d79795f19d55387aa3b..8c1df629bcad4a5bb148a6cdac75f887853f27ae 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 678ab565d691118ff0d4de865c814b2df4a30bb3..9a067264a40737cf79d1d8ae7c574b8d2cc87ce0 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 785cf406e017e591ff1bd0c984c8b0a93b7f127d..d7892e634a64b3f89d673346a11de8bd95577c99 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 209e6c58432dbb5d0a4ad11d0195822489ba5135..97628406d5a10f366a0c3419b32c7357a7c6bf74 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 0000000000000000000000000000000000000000..78e57ed0d000c305c3f1142374640264cb483499 --- /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 b63a44b1a75893cb82dc619a03b8b71cfc597f0d..1014868879e3cb60862a7b711d8f196a35c53b2a 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 145f10cab5f469295f7bce1511ed617798bdb980..be7d619218d6ffd310b09695b1325fa98d8abdbe 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 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 058602118e280831f888fb5e612f883ac8ce39fe..a33eb628556a9fb6b0ee037be81f6b4e30d82c93 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');