鸿蒙初学者学习手册(HarmonyOSNext_API14)_组件截图(@ohos.arkui.componentSnapshot (组件截图) )

前言:

这个模块可以截取组件的图片,无论组件是否已加载。截图只能拍到组件本身的大小区域。 如果组件或其子组件画得超出了自己的区域,超出的部分不会出现在截图中。截图不会拍到与当前组件平级的(兄弟)组件。

模块简介和注意:

- XComponent场景建议:

如果你正在开发一个视频播放器,应该直接从视频画面获取图片,而不是使用组件的截图功能。

- 组件截图注意事项:

如果有一个按钮,但按钮周围有空白,截图时会显示这些空白为透明。

如果给按钮加了一个阴影效果,截图时可能会看到额外的阴影部分。

简单实例

componentSnapshot.get

get(id: string, callback: AsyncCallback<image.PixelMap>, options?: SnapshotOptions): void

参数 类型 说明
id string 目标组件标识
callback AsyncCallback<image.PixelMap> 回调函数
options SnapshotOptions 截图相关的自定参数

AsyncCallback

AsyncCallback<T, E = void> {(err: BusinessError<E>, data: T): void;}

参数 类型 说明
err BusinessError 接口调用失败的公共错误信息。
data T 接口调用时的公共回调信息。

options:SnapshotOptions

参数 类型 说明
scale number 指定截图时图形侧绘制pixelmap的缩放比。
waitUntilRenderFinished boolean 指定是否强制等待系统执行截图指令前所有绘制指令都执行完成之后再截图。
先对项目中的关键代码进行简单讲解,最后是

导入模块:

ts 复制代码
import { componentSnapshot } from '@kit.ArkUI';:导入 componentSnapshot 函数,用于生成组件的快照。
import { image } from '@kit.ImageKit';:导入 image 对象,用于处理图像。

状态变量:

ts 复制代码
@State pixmap: image.PixelMap | undefined = undefined:定义一个状态变量 pixmap,用于存储图像像素映射,初始值为 undefined。

UI 结构:

ts 复制代码
Column():
创建一个垂直排列的容器。
Row():
创建一个水平排列的容器。
Image(this.pixmap):
显示一个 Image 组件,使用状态变量 pixmap 作为图像源,设置宽度和高度为 200 像素,添加黑色边框和外边距。
Image($r('app.media.app_icon')):
显示另一个 Image 组件,使用资源文件 'app.media.app_icon' 作为图像源,自动调整大小,设置宽度和高度为 200 像素,添加外边距,并设置 id 为 "root"。
Button("click to generate UI snapshot"):
创建一个 Button 组件,显示文本 "click to generate UI snapshot",并设置点击事件处理函数。
onClick(() => { ... }):
设置按钮的点击事件处理函数。
componentSnapshot.get("root", (error: Error, pixmap: image.PixelMap) => { ... }, {scale : 2, waitUntilRenderFinished : true}):使用 componentSnapshot.get 方法生成指定 id 的组件快照。
如果生成快照过程中发生错误,打印错误信息并返回。
如果成功生成快照,将生成的像素映射赋值给状态变量 pixmap。

同步执行

ts 复制代码
// 导入 @kit.ArkUI 模块中的 componentSnapshot 函数,用于生成组件快照
import { componentSnapshot } from '@kit.ArkUI';
// 导入 @kit.ImageKit 模块中的 image 对象,用于处理图像
import { image } from '@kit.ImageKit';

// 使用 @Entry 装饰器标记该组件为应用的入口组件
@Entry
// 使用 @Component 装饰器标记该类为一个组件
@Component
// 定义名为 SnapshotExample 的结构化组件
struct SnapshotExample {
  // 定义一个状态变量 pixmap,用于存储图像像素映射,初始值为 undefined
  @State pixmap: image.PixelMap | undefined = undefined

  // 定义组件的构建方法,用于描述组件的 UI 结构
  build() {
    // 创建一个垂直排列的容器 Column
    Column() {
      // 创建一个水平排列的容器 Row
      Row() {
        // 显示一个 Image 组件,使用状态变量 pixmap 作为图像源,设置宽度和高度为 200 像素,添加黑色边框和外边距
        Image(this.pixmap)
          .width(200)
          .height(200)
          .border({ color: Color.Black, width: 2 })
          .margin(5)
        // 显示另一个 Image 组件,使用资源文件 'app.media.app_icon' 作为图像源,自动调整大小,设置宽度和高度为 200 像素,添加外边距,并设置 id 为 "root"
        Image($r('app.media.app_icon'))
          .autoResize(true)
          .width(200)
          .height(200)
          .margin(5)
          .id("root")
      }
      // 创建一个 Button 组件,显示文本 "click to generate UI snapshot",并设置点击事件处理函数
      Button("click to generate UI snapshot")
        .onClick(() => {
          // 使用 componentSnapshot.get 方法生成指定 id 的组件快照
          componentSnapshot.get("root",
            (error: Error, pixmap: image.PixelMap) => {
            // 如果生成快照过程中发生错误,打印错误信息并返回
            if (error) {
              console.log("error: " + JSON.stringify(error))
              return;
            }
            // 如果成功生成快照,将生成的像素映射赋值给状态变量 pixmap
            this.pixmap = pixmap
          }, {scale : 2, waitUntilRenderFinished : true})
        }).margin(10)
    }
    // 设置 Column 容器的宽度为 100%
    .width('100%')
    // 设置 Column 容器的高度为 100%
    .height('100%')
    // 设置 Column 容器的子组件水平对齐方式为居中
    .alignItems(HorizontalAlign.Center)
  }
}

异步执行

ts 复制代码
import { componentSnapshot } from '@kit.ArkUI';
import { image } from '@kit.ImageKit';

@Entry
@Component
struct SnapshotExample {
  @State pixmap: image.PixelMap | undefined = undefined

  build() {
    Column() {
      Row() {
        Image(this.pixmap).width(200).height(200).border({ color: Color.Black, width: 2 }).margin(5)
        Image($r('app.media.img')).autoResize(true).width(200).height(200).margin(5).id("root")
      }
      Button("click to generate UI snapshot")
        .onClick(() => {
          // 建议使用this.getUIContext().getComponentSnapshot().get()
          componentSnapshot.get("root", {scale : 2, waitUntilRenderFinished : true})
            .then((pixmap: image.PixelMap) => {
              this.pixmap = pixmap
            }).catch((err:Error) => {
            console.log("error: " + err)
          })
        }).margin(10)
    }
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center)
  }
}

componentSnapshot.createFromBuilder

createFromBuilder(builder: CustomBuilder, callback: AsyncCallback<image.PixelMap>, delay?: number, checkImageStatus?: boolean, options?: SnapshotOptions): void

参数 类型 说明
builder CustomBuilder 自定义组件构建函数。
callback AsyncCallback<image.PixelMap> 截图返回结果的回调。
delay number 指定触发截图指令的延迟时间。默认值:300单位:毫秒
checkImageStatus boolean 指定是否允许在截图之前,校验图片解码状态。
options SnapshotOptions 截图相关的自定义参数。

AsyncCallback

AsyncCallback<T, E = void> {(err: BusinessError<E>, data: T): void;}

参数 类型 说明
err BusinessError 接口调用失败的公共错误信息。
data T 接口调用时的公共回调信息。

options:SnapshotOptions

参数 类型 说明
scale number 指定截图时图形侧绘制pixelmap的缩放比。
waitUntilRenderFinished boolean 指定是否强制等待系统执行截图指令前所有绘制指令都执行完成之后再截图。

导入模块:

import { componentSnapshot } from '@kit.ArkUI';:导入 componentSnapshot 函数,用于生成组件的快照。

import { image } from '@kit.ImageKit';:导入 image 对象,用于处理图像。

状态变量:

@State pixmap: image.PixelMap | undefined = undefined:定义一个状态变量 pixmap,用于存储图像像素映射,初始值为 undefined。

同步执行

ts 复制代码
// 导入 @kit.ArkUI 模块中的 componentSnapshot 函数,用于生成组件快照
import { componentSnapshot } from '@kit.ArkUI';
// 导入 @kit.ImageKit 模块中的 image 对象,用于处理图像
import { image } from '@kit.ImageKit';

// 使用 @Entry 装饰器标记该组件为应用的入口组件
@Entry
// 使用 @Component 装饰器标记该类为一个组件
@Component
// 定义名为 OffscreenSnapshotExample 的结构化组件
struct OffscreenSnapshotExample {
  // 定义一个状态变量 pixmap,用于存储图像像素映射,初始值为 undefined
  @State pixmap: image.PixelMap | undefined = undefined

  // 定义一个构建器方法 RandomBuilder,用于生成随机内容的 UI 结构
  @Builder
  RandomBuilder() {
    // 创建一个垂直排列的 Flex 容器,设置主轴对齐方式为居中,交叉轴对齐方式为居中
    Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
      // 显示一个 Text 组件,显示文本 'Test menu item 1',设置字体大小为 20 像素,宽度为 100 像素,高度为 50 像素,文本对齐方式为居中
      Text('Test menu item 1')
        .fontSize(20)
        .width(100)
        .height(50)
        .textAlign(TextAlign.Center)
      // 显示一个 Divider 组件,设置高度为 10 像素
      Divider().height(10)
      // 显示另一个 Text 组件,显示文本 'Test menu item 2',设置字体大小为 20 像素,宽度为 100 像素,高度为 50 像素,文本对齐方式为居中
      Text('Test menu item 2')
        .fontSize(20)
        .width(100)
        .height(50)
        .textAlign(TextAlign.Center)
    }
    // 设置 Flex 容器的宽度为 100 像素,并设置 id 为 "builder"
    .width(100)
    .id("builder")
  }

  // 定义组件的构建方法,用于描述组件的 UI 结构
  build() {
    // 创建一个垂直排列的 Column 容器
    Column() {
      // 创建一个 Button 组件,显示文本 "click to generate offscreen UI snapshot",并设置点击事件处理函数
      Button("click to generate offscreen UI snapshot")
        .onClick(() => {
          // 使用 componentSnapshot.createFromBuilder 方法生成指定构建器的快照
          componentSnapshot.createFromBuilder(
            () => { this.RandomBuilder() }, // 提供构建器方法
            (error: Error, pixmap: image.PixelMap) => { // 回调函数处理生成的快照或错误
              // 如果生成快照过程中发生错误,打印错误信息并返回
              if (error) {
                console.log("error: " + JSON.stringify(error))
                return;
              }
              // 如果成功生成快照,将生成的像素映射赋值给状态变量 pixmap
              this.pixmap = pixmap
              // 保存 pixmap 到文件(此处注释掉)
              // ....
              // 获取组件的尺寸和位置信息
              let info = this.getUIContext().getComponentUtils().getRectangleById("builder")
              // 打印组件的宽度、高度以及不同坐标系下的位置信息
              console.log(info.size.width + ' ' + info.size.height + ' ' + info.localOffset.x + ' ' + info.localOffset.y + ' ' + info.windowOffset.x + ' ' + info.windowOffset.y)
            },
            320, // 设置生成快照的宽度为 320 像素
            true, // 设置是否使用硬件加速
            { scale: 2, waitUntilRenderFinished: true } // 设置缩放比例为 2,等待渲染完成后再生成快照
          )
        })
      // 显示一个 Image 组件,使用状态变量 pixmap 作为图像源,设置外边距为 10 像素,高度为 200 像素,宽度为 200 像素,添加黑色边框
      Image(this.pixmap)
        .margin(10)
        .height(200)
        .width(200)
        .border({ color: Color.Black, width: 2 })
    }
    // 设置 Column 容器的宽度为 100%,设置外边距为左 10 像素,上 5 像素,下 5 像素,设置高度为 300 像素
    .width('100%')
    .margin({ left: 10, top: 5, bottom: 5 })
    .height(300)
  }
}
相关推荐
日记成书几秒前
物联网智能项目
物联网·学习
MarkHD26 分钟前
第十八天 WebView深度优化指南
华为·harmonyos
虾球xz28 分钟前
游戏引擎学习第118天
学习·游戏引擎
gz927cool1 小时前
大模型做导师之开源项目学习(lightRAG)
学习·开源·mfc
别说我什么都不会1 小时前
鸿蒙轻内核M核源码分析系列十五 CPU使用率CPUP
操作系统·harmonyos
feiniao86512 小时前
2025年华为手机解锁BL的方法
华为·智能手机
世事如云有卷舒2 小时前
FreeRTOS学习笔记
笔记·学习
靡不有初1113 小时前
CCF-CSP第18次认证第一题——报数【两个与string相关的函数的使用】
c++·学习·ccfcsp
塞尔维亚大汉3 小时前
OpenHarmony(鸿蒙南向)——平台驱动开发【I3C】
harmonyos·领域驱动设计
VVVVWeiYee3 小时前
BGP配置华为——路径优选验证
运维·网络·华为·信息与通信