HarmonyOs DevEco Studio小技巧31--画布组件Canvas

那天我们用画布实现了文字颜色的渐变,实际上画布还有很多好玩的功能,接下来让我们一起试一下画布怎么玩

Canvas

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

接口

Canvas

Canvas(context?: CanvasRenderingContext2D | DrawingRenderingContext)

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

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

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

参数:

参数名 类型 必填 说明
context CanvasRenderingContext2D | DrawingRenderingContext12+ CanvasRenderingContext2D: 不支持多个Canvas共用一个CanvasRenderingContext2D对象,具体描述见CanvasRenderingContext2D对象。DrawingRenderingContext: 不支持多个Canvas共用一个DrawingRenderingContext对象,具体描述见DrawingRenderingContext对象。

Canvas12+

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

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

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

参数:

参数名 类型 必填 说明
context CanvasRenderingContext2D | DrawingRenderingContext12+ CanvasRenderingContext2D: 不支持多个Canvas共用一个CanvasRenderingContext2D对象,具体描述见CanvasRenderingContext2D对象。DrawingRenderingContext: 不支持多个Canvas共用一个DrawingRenderingContext对象,具体描述见DrawingRenderingContext对象。
imageAIOptions ImageAIOptions 给组件设置一个AI分析选项,通过此项可配置分析类型或绑定一个分析控制器。

属性

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

enableAnalyzer12+

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

需要搭配context中的StartImageAnalyzerStopImageAnalyzer一起使用。

不能和overlay属性同时使用,两者同时设置时overlay中CustomBuilder属性将失效。该特性依赖设备能力。

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

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

参数:

参数名 类型 必填 说明
enable boolean 组件支持AI分析,设置为true时,组件可进行AI分析。 默认值:false

事件

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

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

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

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

名称 描述
onReady(event: () => void) Canvas组件初始化完成时或者Canvas组件发生大小变化时的事件回调,当该事件被触发时画布被清空,该事件之后Canvas组件宽高确定且可获取,可使用Canvas相关API进行绘制。当Canvas组件仅发生位置变化时,只触发onAreaChange事件、不触发onReady事件。 onAreaChange事件在onReady事件后触发。

示例代码---画一个矩形

TypeScript 复制代码
@Entry
@Component
struct CanvasExample {
  /** 用来配置CanvasRenderingContext2D对象的参数,包括是否开启抗锯齿。 */
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  /** 用来渲染Canvas的上下文对象。这东西也可以叫画笔 */
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Column() {
      /** 画布/ 这里的context就是绑定上面的画笔 */
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#ffef88af')
        .onReady(() => {
          /** 填充一个矩形 (x,y,w,h) 单位都是vp
           * x  指定矩形左上角点的x坐标。
           * y  指定矩形左上角点的y坐标。
           * w  指定矩形的宽度
           * h	指定矩形的高度。
           * */
          this.context.fillRect(0, 30, 100, 100)
        })
    }
    .width('100%')
    .height('100%')
  }
}

示例代码**---画一个半圆**

TypeScript 复制代码
@Entry
@Component
struct CanvasExample {
  /** 用来配置CanvasRenderingContext2D对象的参数,包括是否开启抗锯齿。 */
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  /** 用来渲染Canvas的上下文对象。这东西也可以叫画笔 */
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Column() {
      /** 画布/ 这里的context就是绑定上面的画笔 */
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#ffef88af')
        .onReady(() => {
          //开始一个新的路径。
          this.context.beginPath() 
          //使用arc方法绘制一个圆形。参数分别为圆心的x坐标、
          // 圆心的y坐标、半径、起始角度(以弧度为单位)和结束角度。
          // 这里的起始角度是0度(即π弧度),结束角度是π弧度,
          // 所以绘制的是一个半圆。
          this.context.arc(180, 180, 100, 0, Math.PI) 
          //设置线条的宽度为4像素
          this.context.lineWidth = 4
          //设置填充颜色为黑色
          this.context.fillStyle = Color.Black
          //使用当前的线条样式(颜色和宽度)来绘制圆形的轮廓
          this.context.stroke()
          //使用当前的填充颜色来填充圆形的内部
          this.context.fill()
          //关闭当前的路径
          this.context.closePath() 
        })
    }
    .width('100%')
    .height('100%')
  }
}

示例代码 --画一个六边形

TypeScript 复制代码
@Entry
@Component
struct CanvasExample {
  /** 用来配置CanvasRenderingContext2D对象的参数,包括是否开启抗锯齿。 */
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  /** 用来渲染Canvas的上下文对象。这东西也可以叫画笔 */
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Column() {
      /** 画布/ 这里的context就是绑定上面的画笔 */
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#ffef88af')
        .onReady(() => {
          // 以画布左上角为基准0,0
          this.context.beginPath() // 开始画
          this.context.moveTo(180, 280) // 移动到六芒星的中心点
          for (let i = 0; i < 6; i++) {
            this.context.lineTo(180 + 100 * Math.cos(2 * Math.PI * i / 6 + Math.PI / 2),
              180 + 100 * Math.sin(2 * Math.PI * i / 6 + Math.PI / 2))
          }
          this.context.closePath() // 结束画
          this.context.lineWidth = 10
          this.context.strokeStyle = Color.White
          this.context.stroke()

        })
    }
    .width('100%')
    .height('100%')
  }
}

示例代码 --自己画

TypeScript 复制代码
@Entry
@Component
struct CanvasExample {
  /** 用来配置CanvasRenderingContext2D对象的参数,包括是否开启抗锯齿。 */
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  /** 用来渲染Canvas的上下文对象。这东西也可以叫画笔 */
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Column() {
      /** 画布/ 这里的context就是绑定上面的画笔 */
      Canvas(this.context)
        .width('100%')
        .layoutWeight(1)
        .backgroundColor('#ffef88af')
        .onTouch(event => {
          this.context.lineWidth = 10
          this.context.strokeStyle = Color.White
          if (event.type === TouchType.Down) {
            this.context.beginPath()
            this.context.moveTo(event.touches[0].x, event.touches[0].y)
          }
          if (event.type === TouchType.Move) {
            this.context.lineTo(event.touches[0].x, event.touches[0].y)
            this.context.stroke()
          }
          if (event.type === TouchType.Up) {
            this.context.closePath()
          }
        })
      Button("清屏")
        .onClick(() => {
          this.context.clearRect(0, 0, 360, 660)
        })
    }
    .width('100%')
    .height('100%')
  }
}

还有很多种玩法 ,自己有时间可以看看

CanvasRenderingContext2D-画布绘制-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

相关推荐
枫叶丹41 小时前
【HarmonyOS 6.0】ArkWeb PDF预览回调功能详解:让PDF加载状态可控可感
开发语言·华为·pdf·harmonyos
nashane2 小时前
HarmonyOS 6学习:音频焦点管理实战——解决应用打开中断听书功能的技术指南
学习·音视频·harmonyos·harmonyos 5
nashane3 小时前
HarmonyOS 6学习:位置权限已开启却仍报错?深度解析与实战解决方案
学习·华为·harmonyos·harmonyos 5
被温水煮的青蛙3 小时前
ArkUI List 图片拖动排序最佳实践
harmonyos
liulian09164 小时前
【Flutter for OpenHarmony第三方库】Flutter for OpenHarmony应用更新检测功能实战指南
flutter·华为·学习方法·harmonyos
IntMainJhy4 小时前
【Flutter for OpenHarmony 】第三方库 实战:`cached_network_image` 图片缓存+骨架屏鸿蒙适配全指南✨
flutter·缓存·harmonyos
轻口味4 小时前
HarmonyOS 6 轻相机应用开发1:功能介绍与框架搭建
数码相机·华为·harmonyos
nashane5 小时前
HarmonyOS 6学习:界面布局“消消乐”——实战拆解组件遮挡与快照技术
深度学习·学习·harmonyos·harmony app
枫叶丹45 小时前
【HarmonyOS 6.0】ArkWeb PDF浏览能力增强:指定PDF文档背景色功能详解
开发语言·华为·pdf·harmonyos
哈__6 小时前
新手入门harmonyOS开发:手把手教你用ArkTS实现一个天气应用
harmonyos·arkts