From 58c6318e074c89d39b73dd9e1311aa0628e36137 Mon Sep 17 00:00:00 2001 From: coolfeng Date: Tue, 11 Nov 2025 15:18:53 +0800 Subject: [PATCH] add webNestedScroll2 Signed-off-by: coolfeng --- .../build-profile.json5 | 6 +- .../entry/src/main/ets/pages/Index.ets | 6 +- .../src/main/ets/pages/WebNestedScroll.ets | 118 ++++++++++++++++++ .../resources/base/profile/main_pages.json | 1 + .../src/ohosTest/ets/test/Ability.test.ets | 47 ++++++- 5 files changed, 169 insertions(+), 9 deletions(-) create mode 100644 ArkWebKit/ManageWebPageInteracts/entry/src/main/ets/pages/WebNestedScroll.ets diff --git a/ArkWebKit/ManageWebPageInteracts/build-profile.json5 b/ArkWebKit/ManageWebPageInteracts/build-profile.json5 index 7629c2f19bc..8b7aa4f7825 100755 --- a/ArkWebKit/ManageWebPageInteracts/build-profile.json5 +++ b/ArkWebKit/ManageWebPageInteracts/build-profile.json5 @@ -20,9 +20,9 @@ { "name": "default", "signingConfig": "default", - "compatibleSdkVersion": "5.0.2(14)", - "targetSdkVersion": "5.0.2(14)", - "runtimeOS": "HarmonyOS", + "compatibleSdkVersion": "6.0.0(20)", + "targetSdkVersion": "6.0.0(20)", + "runtimeOS": "HarmonyOS" } ], "buildModeSet": [ diff --git a/ArkWebKit/ManageWebPageInteracts/entry/src/main/ets/pages/Index.ets b/ArkWebKit/ManageWebPageInteracts/entry/src/main/ets/pages/Index.ets index 94ee9bb2185..0c08915744a 100755 --- a/ArkWebKit/ManageWebPageInteracts/entry/src/main/ets/pages/Index.ets +++ b/ArkWebKit/ManageWebPageInteracts/entry/src/main/ets/pages/Index.ets @@ -20,10 +20,14 @@ import { router } from '@kit.ArkUI'; struct Index { build() { Column({ space: 10 }) { - Button('ImpNestedScroll') + Button('WebNestedScroll1') .onClick(() => { router.pushUrl({ url: 'pages/ImpNestedScroll' }); }) + Button('WebNestedScroll2') + .onClick(() => { + router.pushUrl({ url: 'pages/WebNestedScroll' }); + }) Button('OnIntKbdAttachSysCustIn') .onClick(() => { router.pushUrl({ url: 'pages/OnIntKbdAttachSysCustIn' }); diff --git a/ArkWebKit/ManageWebPageInteracts/entry/src/main/ets/pages/WebNestedScroll.ets b/ArkWebKit/ManageWebPageInteracts/entry/src/main/ets/pages/WebNestedScroll.ets new file mode 100644 index 00000000000..759ffecfce2 --- /dev/null +++ b/ArkWebKit/ManageWebPageInteracts/entry/src/main/ets/pages/WebNestedScroll.ets @@ -0,0 +1,118 @@ +/* + * 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. + */ + +// [Start nested_scrolling2] +import { webview } from '@kit.ArkWeb'; + +@Entry +@ComponentV2 +struct Index { + private scroller: Scroller = new Scroller() + private listScroller: Scroller = new Scroller() + private webController: webview.WebviewController = new webview.WebviewController() + private isWebAtEnd: boolean = false + private webHeight: number = 0 + @Local arr: Array = [] + + aboutToAppear(): void { + for (let i = 0; i < 10; i++) { + this.arr.push(i) + } + } + + getWebHeight() { + try { + this.webController?.runJavaScriptExt('window.innerHeight', + (error, result) => { + if (error || !result) { + return; + } + if (result.getType() === webview.JsMessageType.NUMBER) { + this.webHeight = result.getNumber() + } + }) + } catch (error) { + } + } + + checkScrollBottom() { + this.isWebAtEnd = false; + if (this.webController.getPageOffset().y + this.webHeight >= this.webController.getPageHeight()) { + this.isWebAtEnd = true; + } + } + + build() { + Scroll(this.scroller) { + Column() { + Web({ + src: $rawfile('scroll.html'), + controller: this.webController, + }).height('100%') + .bypassVsyncCondition(WebBypassVsyncCondition.SCROLLBY_FROM_ZERO_OFFSET) + .onPageEnd(() => { + this.webController.setScrollable(false, webview.ScrollType.EVENT); + this.getWebHeight(); + }) + // 在识别器即将要成功时,根据当前组件状态,设置识别器使能状态 + .onGestureRecognizerJudgeBegin((event: BaseGestureEvent, current: GestureRecognizer, + others: Array) => { + if (current.isBuiltIn() && current.getType() == GestureControl.GestureType.PAN_GESTURE) { + return GestureJudgeResult.REJECT; + } + return GestureJudgeResult.CONTINUE; + }) + List({ scroller: this.listScroller }) { + Repeat(this.arr) + .each((item: RepeatItem) => { + ListItem() { + Text('Scroll Area') + .width('100%') + .height('40%') + .backgroundColor(0X330000FF) + .fontSize(16) + .textAlign(TextAlign.Center) + } + }) + }.height('100%') + .maintainVisibleContentPosition(true) + .enableScrollInteraction(false) + } + } + .onScrollFrameBegin((offset: number, state: ScrollState) => { + this.checkScrollBottom(); + if (offset > 0) { + if (!this.isWebAtEnd) { + this.webController.scrollBy(0, offset) + return { offsetRemain: 0 } + } else if (this.scroller.isAtEnd()) { + this.listScroller.scrollBy(0, offset) + return { offsetRemain: 0 } + } + } else if (offset < 0) { + if (this.listScroller.currentOffset().yOffset > 0) { + this.listScroller.scrollBy(0, offset) + return { offsetRemain: 0 } + } else if (this.scroller.currentOffset().yOffset <= 0) { + this.webController.scrollBy(0, offset) + return { offsetRemain: 0 } + } + } + return { offsetRemain: offset } + }) + } +} + +// [End nested_scrolling2] \ No newline at end of file diff --git a/ArkWebKit/ManageWebPageInteracts/entry/src/main/resources/base/profile/main_pages.json b/ArkWebKit/ManageWebPageInteracts/entry/src/main/resources/base/profile/main_pages.json index 08d6cd1a732..55a56a9fc27 100755 --- a/ArkWebKit/ManageWebPageInteracts/entry/src/main/resources/base/profile/main_pages.json +++ b/ArkWebKit/ManageWebPageInteracts/entry/src/main/resources/base/profile/main_pages.json @@ -2,6 +2,7 @@ "src": [ "pages/Index", "pages/ImpNestedScroll", + "pages/WebNestedScroll", "pages/OnIntKbdAttachSysCustIn", "pages/SetSKBMode_one" ] diff --git a/ArkWebKit/ManageWebPageInteracts/entry/src/ohosTest/ets/test/Ability.test.ets b/ArkWebKit/ManageWebPageInteracts/entry/src/ohosTest/ets/test/Ability.test.ets index 11063cac962..cf46045a6d1 100755 --- a/ArkWebKit/ManageWebPageInteracts/entry/src/ohosTest/ets/test/Ability.test.ets +++ b/ArkWebKit/ManageWebPageInteracts/entry/src/ohosTest/ets/test/Ability.test.ets @@ -42,11 +42,11 @@ export default function abilityTest() { }) /* - * 打开应用,点击 ImpNestedScroll 按钮 + * 打开应用,点击 WebNestedScroll1 按钮 * 设置滚动模式 */ - it('ImpNestedScroll', 30000, async (done: Function) => { - console.info('uitest: ImpNestedScroll begin'); + it('WebNestedScroll1', 30000, async (done: Function) => { + console.info('uitest: WebNestedScroll1 begin'); const want: Want = { bundleName: bundleName, abilityName: 'EntryAbility' @@ -59,7 +59,7 @@ export default function abilityTest() { expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); await driver.delayMs(1000); - const button1 = await driver.findComponent(ON.text('ImpNestedScroll')); + const button1 = await driver.findComponent(ON.text('WebNestedScroll1')); await button1.click(); await driver.delayMs(500); @@ -76,10 +76,47 @@ export default function abilityTest() { await driver.delayMs(500); await driver.pressBack(); - console.info('uitest: ImpNestedScroll end'); + console.info('uitest: WebNestedScroll1 end'); done(); }); + /* + * 打开应用,点击 WebNestedScroll2 按钮 + * 设置滚动模式 + */ + it('WebNestedScroll2', 30000, async (done: Function) => { + console.info('uitest: WebNestedScroll2 begin'); + const want: Want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + await driver.delayMs(1000); + + const button1 = await driver.findComponent(ON.text('WebNestedScroll2')); + await button1.click(); + await driver.delayMs(500); + + await driver.swipe(649, 1934, 649, 697, 2000) + await driver.delayMs(500); + + await driver.swipe(649, 1934, 649, 697, 2000) + await driver.delayMs(500) + + await driver.swipe(649, 697, 649, 1934, 2000) + await driver.delayMs(500); + + await driver.swipe(649, 697, 649, 1934, 2000) + await driver.delayMs(500); + await driver.pressBack(); + console.info('uitest: WebNestedScroll2 end'); + done(); + }); /* * 打开应用,点击 OnIntKbdAttachSysCustIn 按钮 * 调用onInterceptKeyboardAttach来拦截系统软键盘的弹出 -- Gitee