文档管理中心
您当前正在浏览HarmonyOS最新文档,覆盖已发布的所有API版本,可在API参考中筛选您使用的API版本。详细的版本配套关系请参考版本说明
API参考应用框架ArkUI(方舟UI框架)ArkTS组件画布绘制Canvas

Canvas

提供画布组件,用于自定义绘制图形。

说明

该组件从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

子组件

PhonePC/2in1TabletTVWearable

不支持。

接口

PhonePC/2in1TabletTVWearable

Canvas23+

PhonePC/2in1TabletTVWearable

Canvas(params: CanvasParams)

使用CanvasParams创建不缓存指令的Canvas组件。创建Canvas组件时,最大面积不超过10000px*10000px,超过最大面积则无法正常创建。Canvas组件未设置固定尺寸时,默认扩展至其最大可用尺寸。

说明
  • 使用本接口创建的Canvas组件将在onReady23+回调的入参中返回一个DrawingRenderingContext12+对象,可用于在该Canvas组件上进行绘制。

  • 使用本接口创建的Canvas组件在组件不可见时将不响应绘制指令。

  • 不可见场景主要包括组件所在的页面进入后台、组件滑到窗口外、设置visibility属性为隐藏等,不包括组件被其他组件或是其他窗口遮挡导致不可见的场景。

元服务API: 从API version 23开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

模型约束: 此接口仅可在Stage模型下使用。

参数:

展开
参数名 类型 必填 说明
params CanvasParams Canvas组件的构造参数,用于创建不缓存指令的Canvas组件。配置参数详见CanvasParams

Canvas

PhonePC/2in1TabletTVWearable

Canvas(context?: CanvasRenderingContext2D | DrawingRenderingContext)

创建Canvas组件时,最大面积不超过10000px*10000px,超过最大面积则无法正常创建。

使用本接口创建的Canvas组件在组件不可见时将不响应绘制指令。不可见场景主要包括组件所在的页面进入后台、组件滑到窗口外、设置visibility属性为隐藏等,不包括组件被其他组件或是其他窗口遮挡导致不可见的场景。

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

展开
参数名 类型 必填 说明
context CanvasRenderingContext2D | DrawingRenderingContext12+

CanvasRenderingContext2D: 不支持多个Canvas共用一个CanvasRenderingContext2D对象,具体描述见CanvasRenderingContext2D对象。DrawingRenderingContext: 不支持多个Canvas共用一个DrawingRenderingContext对象,具体描述见DrawingRenderingContext对象。

异常值null和undefined按未设置context处理。

Canvas12+

PhonePC/2in1TabletTVWearable

Canvas(context: CanvasRenderingContext2D | DrawingRenderingContext, imageAIOptions: ImageAIOptions)

创建Canvas组件时,最大面积不超过10000px*10000px,超过最大面积则无法正常创建。支持设置CanvasRenderingContext2D对象或DrawingRenderingContext对象,支持设置AI分析选项。

使用本接口创建的Canvas组件在组件不可见时将不响应绘制指令。不可见场景主要包括组件所在的页面进入后台、组件滑到窗口外、设置visibility属性为隐藏等,不包括组件被其他组件或是其他窗口遮挡导致不可见的场景。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

展开
参数名 类型 必填 说明
context CanvasRenderingContext2D | DrawingRenderingContext12+

CanvasRenderingContext2D: 不支持多个Canvas共用一个CanvasRenderingContext2D对象,具体描述见CanvasRenderingContext2D对象。DrawingRenderingContext: 不支持多个Canvas共用一个DrawingRenderingContext对象,具体描述见DrawingRenderingContext对象。

异常值null和undefined按未设置context处理。

imageAIOptions ImageAIOptions

给组件设置一个AI分析选项,通过此项可配置分析类型或绑定一个分析控制器。

异常值null和undefined按ImageAIOptions的默认值处理,默认取值为{ type: [ImageAnalyzerType.SUBJECT, ImageAnalyzerType.TEXT], aiController: new ImageAnalyzerController() },即开启主体识别和文字识别功能。

CanvasParams23+

PhonePC/2in1TabletTVWearable

定义Canvas的具体配置参数。

元服务API: 从API version 23开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

模型约束: 此接口仅可在Stage模型下使用。

展开
名称 类型 只读 可选 说明
unit LengthMetricsUnit

用于描述Canvas绘制时所采用的单位模式,不同单位模式会影响绘制时的坐标和尺寸计算方式,具体说明见LengthMetricsUnit

仅可在创建Canvas时设置,后续不可修改。

默认值:LengthMetricsUnit.DEFAULT

imageAIOptions ImageAIOptions

给组件设置一个AI分析选项,通过此项可配置分析类型或绑定一个分析控制器。

异常值null和undefined按不开启AI分析功能处理。

默认值:不开启AI分析功能。

属性

PhonePC/2in1TabletTVWearable

除支持通用属性外,还支持以下属性:

enableAnalyzer12+

PhonePC/2in1TabletTVWearable

enableAnalyzer(enable: boolean)

设置组件支持AI分析,当前支持主体识别、文字识别和对象查找等功能,支持attributeModifier动态设置属性方法。

需要搭配CanvasRenderingContext2D中的startImageAnalyzerstopImageAnalyzer一起使用。

不能和overlay属性同时使用,两者同时设置时overlay中CustomBuilder属性将失效。该特性依赖设备能力,可通过ImageAnalyzerController.getImageAnalyzerSupportTypes接口查询设备支持的分析类型。

说明

从API version 20开始,该接口支持在attributeModifier中调用。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

展开
参数名 类型 必填 说明
enable boolean

设置组件是否开启AI分析功能,开启时需要组件内容支持主体识别、文字识别或对象查找。

设置为true时,组件可进行AI分析,设置为false时,组件不可进行AI分析。

异常值null和undefined按false处理。

默认值:false

事件

PhonePC/2in1TabletTVWearable

除支持通用事件外,还支持如下事件:

onReady

PhonePC/2in1TabletTVWearable

onReady(event: VoidCallback)

Canvas组件初始化完成或者发生大小变化时的事件回调,支持attributeModifier动态设置属性方法。

当该事件被触发时画布被清空,该事件之后Canvas组件宽高确定且可获取,可使用Canvas相关API进行绘制。当Canvas组件仅发生位置变化时,只触发onAreaChange事件,不触发onReady事件。onAreaChange事件在onReady事件后触发。

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

展开
参数名 类型 必填 说明
event VoidCallback Canvas组件初始化完成或者发生大小变化时的回调事件。

onReady23+

PhonePC/2in1TabletTVWearable

onReady(event: Callback<DrawingRenderingContext | undefined> | undefined)

Canvas组件初始化完成或者发生大小变化时的事件回调,支持attributeModifier动态设置属性方法。

当该事件被触发时画布被清空,该事件之后Canvas组件宽高确定且可获取,可使用Canvas相关API进行绘制。当Canvas组件仅发生位置变化时,只触发onAreaChange事件,不触发onReady事件。onAreaChange事件在onReady事件后触发。

卡片能力: 从API version 23开始,该接口支持在ArkTS卡片中使用。

元服务API: 从API version 23开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

模型约束: 此接口仅可在Stage模型下使用。

参数:

展开
参数名 类型 必填 说明
event Callback<DrawingRenderingContext | undefined> | undefined

Canvas组件初始化完成或者发生大小变化时的回调事件。

关于Callback<DrawingRenderingContext |undefined>类型的入参:

1. 只有使用CanvasParams创建的Canvas组件在该回调中返回DrawingRenderingContext对象,否则返回undefined。

2. 该回调返回的DrawingRenderingContext对象不允许作为参数创建Canvas组件,否则会导致应用崩溃。

示例

PhonePC/2in1TabletTVWearable

示例1(使用CanvasRenderingContext2D中的方法)

该示例实现了如何在Canvas组件使用CanvasRenderingContext2D中的方法进行绘制。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct CanvasExample {
  5. private settings: RenderingContextSettings = new RenderingContextSettings(true);
  6. private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
  7. build() {
  8. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  9. Canvas(this.context)
  10. .width('100%')
  11. .height('100%')
  12. .backgroundColor('#ffff00')
  13. .onReady(() => {
  14. this.context.fillRect(0, 30, 100, 100)
  15. })
  16. }
  17. .width('100%')
  18. .height('100%')
  19. }
  20. }

示例2(使用DrawingRenderingContext中的方法)

该示例实现了如何在Canvas组件使用DrawingRenderingContext中的方法进行绘制。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct CanvasExample {
  5. private context: DrawingRenderingContext = new DrawingRenderingContext();
  6. build() {
  7. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  8. Canvas(this.context)
  9. .width('100%')
  10. .height('100%')
  11. .backgroundColor('rgb(213,213,213)')
  12. .onReady(() => {
  13. this.context.canvas.drawCircle(200, 200, 100)
  14. this.context.invalidate()
  15. })
  16. }
  17. .width('100%')
  18. .height('100%')
  19. }
  20. }

示例3(使用attributeModifier动态设置Canvas组件的属性及方法)

该示例展示了如何使用attributeModifier动态设置Canvas组件的enableAnalyzer属性和onReady方法。

说明

此示例的资源不在src > main > resource目录下,从DevEco Studio 6.0.0 Beta2版本开始,新建工程或模块时,默认创建的模块不会对非resources目录下的资源进行打包,需启用相关开关:模块的build-profile.json5中buildOption > resOptions > copyCodeResource > enable设置为true,详见resOptions中copyCodeResource相关介绍。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. class MyCanvasModifier implements AttributeModifier<CanvasAttribute> {
  4. context: CanvasRenderingContext2D = new CanvasRenderingContext2D()
  5. applyNormalAttribute(instance: CanvasAttribute): void {
  6. // 从(0,0)绘制一张宽高为200vp的图片
  7. instance.onReady(() => {
  8. // "common/img.png"需要替换为开发者所需的图像资源文件
  9. let image = new ImageBitmap("common/img.png")
  10. this.context.drawImage(image, 0, 0, 200, 200)
  11. })
  12. // 设置开启组件AI分析功能,点击start按钮调用startImageAnalyzer方法启动AI分析
  13. instance.enableAnalyzer(true)
  14. }
  15. }
  16. @Entry
  17. @Component
  18. struct attributeDemo {
  19. @State modifier: MyCanvasModifier = new MyCanvasModifier()
  20. private settings: RenderingContextSettings = new RenderingContextSettings(true)
  21. private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  22. private config: ImageAnalyzerConfig = {
  23. types: [ImageAnalyzerType.SUBJECT, ImageAnalyzerType.TEXT]
  24. }
  25. private aiController: ImageAnalyzerController = new ImageAnalyzerController()
  26. private options: ImageAIOptions = {
  27. types: [ImageAnalyzerType.SUBJECT, ImageAnalyzerType.TEXT],
  28. aiController: this.aiController
  29. }
  30. build() {
  31. Row() {
  32. Column() {
  33. Button('start')
  34. .width(100)
  35. .height(50)
  36. .margin(5)
  37. .onClick(() => {
  38. this.context.startImageAnalyzer(this.config)
  39. .then(() => {
  40. console.info("analysis complete")
  41. })
  42. .catch((error: BusinessError) => {
  43. console.error(`Error code: ${error.code}, message: ${error.message}`)
  44. })
  45. })
  46. Button('stop')
  47. .width(100)
  48. .height(50)
  49. .margin(5)
  50. .onClick(() => {
  51. this.context.stopImageAnalyzer()
  52. })
  53. Button('getTypes')
  54. .width(100)
  55. .height(50)
  56. .margin(5)
  57. .onClick(() => {
  58. this.aiController.getImageAnalyzerSupportTypes()
  59. })
  60. Canvas(this.context, this.options)
  61. .borderWidth(1)
  62. .height(200)
  63. .width(200)
  64. .attributeModifier(this.modifier)
  65. .onAppear(() => {
  66. this.modifier.context = this.context
  67. })
  68. }
  69. }
  70. }
  71. }

示例4(创建不缓存指令Canvas并进行绘制)

该示例介绍了如何使用CanvasParams创建不缓存指令的Canvas组件并进行绘制。

从API version 23开始,新增CanvasParams接口。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { LengthMetricsUnit } from '@kit.ArkUI';
  3. import { drawing } from '@kit.ArkGraphics2D';
  4. @Entry
  5. @Component
  6. struct CanvasExample {
  7. build() {
  8. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  9. Canvas({ unit: LengthMetricsUnit.DEFAULT })
  10. .onReady((drawingContext?: DrawingRenderingContext) => {
  11. if (!drawingContext) {
  12. return
  13. }
  14. // 使用DrawingRenderingContext进行绘制。
  15. let brush = new drawing.Brush()
  16. brush.setColor({
  17. alpha: 255,
  18. red: 39,
  19. green: 135,
  20. blue: 217
  21. })
  22. drawingContext.canvas.attachBrush(brush)
  23. drawingContext.canvas.drawCircle(200, 200, 100)
  24. drawingContext.invalidate()
  25. // 使用CanvasRenderingContext2D进行绘制。
  26. let context2D: CanvasRenderingContext2D =
  27. CanvasRenderingContext2D.getContext2DFromDrawingContext(drawingContext, { antialias: true })
  28. context2D.fillStyle = 'rgb(39,135,217)'
  29. context2D.fillRect(110, 30, 100, 100)
  30. })
  31. }
  32. .width('100%')
  33. .height('100%')
  34. }
  35. }

在 API参考 中进行搜索
请输入您想要搜索的关键词