首页 > 其他分享 >解析华为鸿蒙next:Web组件自适应布局与渲染模式详解

解析华为鸿蒙next:Web组件自适应布局与渲染模式详解

时间:2024-10-17 14:36:21浏览次数:7  
标签:Web 鸿蒙 ... 渲染 模式 next 组件 页面

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。
主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。
本文为原创内容,任何形式的转载必须注明出处及原作者。

Web 组件大小自适应页面内容布局
使用 Web 组件大小自适应页面内容布局模式 layoutMode(WebLayoutMode.FIT_CONTENT) 可以使 Web 组件的大小根据页面内容自适应变化。适用于 Web 组件需要根据网页高度撑开,与其他原生组件一起滚动的场景,如浏览长文章、长页面首页等。

@Entry
@Component
struct WebHeightPage {
  // ...
  build() {
    Column() {
      // ...
      Web({
        // ...
        .layoutMode(WebLayoutMode.FIT_CONTENT) // 设置为 Web 组件大小自适应页面内容
        .overScrollMode(OverScrollMode.NEVER) // 设置过滚动模式为关闭状态
      })
    }
  }
}

Web 组件渲染模式
Web 组件支持两种渲染模式:

  • 异步渲染模式(默认)renderMode: RenderMode.ASYNC_RENDER
  • 同步渲染模式renderMode: RenderMode.SYNC_RENDER
    异步渲染模式下,Web 组件作为图形 surface 节点,独立送显。建议在仅由 Web 组件构成的应用页面中使用此模式,有更好的性能和更低的功耗表现。
    同步渲染模式下,Web 组件作为图形 canvas 节点,Web 渲染跟随系统组件一起送显。可以渲染更长 Web 组件内容,但会消耗更多的性能资源。
@Entry
@Component
struct WebHeightPage {
  // ...
  build() {
    Column() {
      // ...
      Web({
        // ...
        .renderMode(RenderMode.ASYNC_RENDER) // 设置为异步渲染模式
      })
    }
  }
}

在应用中使用前端页面 JavaScript
前端页面和应用侧之间可以用 createWebMessagePorts() 接口创建消息端口来实现两端的通信。

@Entry
@Component
struct WebComponent {
  // ...
  build() {
    Column() {
      // ...
      Button('postMessage')
        .onClick(() => {
          try {
            // 1、创建两个消息端口。
            this.ports = this.controller.createWebMessagePorts();
            // 2、在应用侧的消息端口(如端口 1)上注册回调事件。
            this.ports[1].onMessageEvent((result: webview.WebMessage) => {
              // ...
            });
            // 3、将另一个消息端口(如端口 0)发送到 HTML 侧,由 HTML 侧保存并使用。
            this.controller.postMessage('__init_port__', [this.ports[0]], '*');
          } catch (error) {
            // ...
          }
        })
      // ...
    }
  }
}

应用侧与前端页面的相互调用 (C/C++)
前端页面和应用侧之间可以使用本文 Native 方法实现两端通信,可解决 ArkTS 环境的冗余切换,同时允许发送消息、回调在非 UI 线程上报,避免造成 UI 阻塞。当前只支持 string 和 buffer 数据类型。

// ArkTS 侧代码
// ...
aboutToAppear() {
  console.info("aboutToAppear")
  // 初始化 web ndk
  testNapi.nativeWebInit(this.webTag);
}
// ...
build() {
  // ...
  Web({ src: $rawfile('index.html'), controller: this.controller })
    .onConsole((event) => {
      if (event) {
        let msg = event.message.getMessage()
        if (msg.startsWith("H5")) {
          this.h5Log = event.message.getMessage() + "\n" + this.h5Log
        }
      }
      return false;
    })
}
// ...
// NAPI 侧代码
// ...
static void WebMessagePortCallback(const char *webTag, const ArkWeb_WebMessagePortPtr port, const ArkWeb_WebMessagePtr message, void *userData) {
  // ...
}
// ...

总结
通过本文,您已经了解了华为鸿蒙 ArkWeb 的高级功能与应用,包括 Web 组件大小自适应页面内容布局、Web 组件渲染模式、在应用中使用前端页面 JavaScript 以及应用侧与前端页面的相互调用 (C/C++)等功能。这些功能可以帮助您更好地控制 Web 组件的行为,并提升您的应用程序的性能和用户体验。

标签:Web,鸿蒙,...,渲染,模式,next,组件,页面
From: https://www.cnblogs.com/samex/p/18472240

相关文章

  • 鸿蒙开发黑科技:前端页面轻松调用 ArkTS 函数
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在鸿蒙开发中,前端页面(HTML)有时候需要......
  • 全方位探索华为鸿蒙ArkWeb:构建高性能跨平台新闻阅读应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言:ArkWeb的优势与跨平台应用的......
  • 【Next.js 项目实战系列】07-分配 Issue 给用户
    原文链接CSDN的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 上一篇【Next.js项目实战系列】06-身份验证分配Issue给用户本节代码链接SelectButton​#/app/issues/[id]/AssigneeSelect.tsx"useclient";import{Sel......
  • 构建高效在线考试平台:Spring Boot与JavaWeb的融合
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现的相关信息成为必然。开发合适的基于JavaWeb技术......
  • Spring Boot驱动的在线考试系统:JavaWeb技术实战
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现的相关信息成为必然。开发合适的基于JavaWeb技术......
  • 鸿蒙3D开发
    需求:创建一个按钮。按下按钮后,按钮需缩小并向手指方向倾斜。分析:可以使用 button 组件来实现该功能,其他组件也同样适用。按下按钮时需利用 .ontouch 事件。缩小效果通过 scale 属性的变化实现。为了确定手指的方向,我们可以在 .ontouch 事件中获取相关信息,具体包......
  • 解决WebBrowser背景不能透明的问题
    在WPF中使用WebBrowser控件时,WebBrowser是一个单独绘制句柄,除了显示层级更高外,还不支持透明。在我前面的文章中,解决了不规则窗口下,将WebBrowser显示出来。https://www.cnblogs.com/zhaotianff/p/18408345但是在页面未加载出来之前,能看到短暂的白屏情况。一开始我查阅了各种资......
  • 鸿蒙 NEXT 如何使用 @Styles 装饰器来优化我的组件代码?
    大家好,我是V哥。在鸿蒙NEXT开发中,@Styles装饰器是一种非常有用的方法,用于定义可重用的样式。这使得开发者可以将多条样式设置提炼成一个方法,以便在多个组件中复用,从而提高代码的可维护性和可读性。以下是@Styles装饰器的详细用法和应用场景案例。@Styles装饰器的使用说明......
  • 解决WPF WebBrowser当前页面的脚本错误问题
    因为会有用户要求,需要将客户端体积最小化,不能使用新的浏览器控件,只能使用WebBrowser。而WebBrowser是IE内核的,现在很多js的API已经不能识别了。所以会报脚本错误,类似下面这样 解决方法的原理:WebBrowser内部是一个InternetExplorer实例,对应的是IWebBrowser2实例。IWebBrowse......
  • 【Golang】Go语言Web开发之模板渲染
    ✨✨欢迎大家来到景天科技苑✨✨......