【鸿蒙开发】画布组件 Canvas

news2024/11/24 1:47:11

1. Canvas

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

接口:

Canvas(context?: CanvasRenderingContext2D)

参数:

参数名

参数类型

必填

默认值

参数描述

context

CanvasRenderingContext2D

-

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

Canvas 组件需要一个 context 控制绘图

2. CanvasRenderingContext2D

使用RenderingContext在Canvas组件上进行绘制,绘制对象可以是矩形、文本、图片等。

接口:

CanvasRenderingContext2D(settings?: RenderingContextSetting)

参数:

参数名

参数类型

必填

参数描述

settings

RenderingContextSettings

见RenderingContextSettings。

可以传入 settings 参数,是否开启抗锯齿

属性:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/ts-canvasrenderingcontext2d-0000001478181441-V2#ZH-CN_TOPIC_0000001573928937__%E5%B1%9E%E6%80%A7

方法:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/ts-canvasrenderingcontext2d-0000001478181441-V2#ZH-CN_TOPIC_0000001573928937__%E6%96%B9%E6%B3%95

3. RenderingContextSetting

用来配置CanvasRenderingContext2D对象的参数,包括是否开启抗锯齿。

接口:

RenderingContextSettings(antialias?: boolean)

参数:

参数名

参数类型

必填

参数描述

antialias

boolean

表明canvas是否开启抗锯齿。

默认值:false

4. 绘制示例

4.1 画线

在绘制前和绘制后要调用 context.beginPath() 和 context.closePath() 方法,形成封闭路径

@Entry
@Component
struct Index {
  // 开启抗锯齿配置
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Column() {
      Canvas(this.context)
        .width('100%')
        .height(360)
        .backgroundColor("#ccc")

      Row() {
        Button("画线")
          .onClick(() => {
            this.context.beginPath() // 开始绘制路径
            this.context.strokeStyle = 'blue' // 描边颜色
            this.context.moveTo(10, 10) // 移动当前点路径到指定点
            this.context.lineTo(150, 150) // 连接当前点到指定点路径
            this.context.stroke() // 边框绘制
            this.context.closePath() // 结束绘制路径

            this.context.beginPath() // 开始绘制路径
            this.context.lineWidth = 4 // 线条宽度
            this.context.strokeStyle = "red" // 描边颜色
            this.context.moveTo(200, 10) // 移动当前点路径到指定点
            this.context.lineTo(50, 100) // 连接当前点到指定点路径
            this.context.stroke() // 边框绘制
            this.context.closePath() // 结束绘制路径
          })
      }

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

4.2 画圆

@Entry
@Component
struct Index {
  // 开启抗锯齿配置
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Column() {
      Canvas(this.context)
        .width('100%')
        .height(360)
        .backgroundColor("#ccc")

      Row() {
        Button("画圆")
          .onClick(() => {
            this.context.beginPath() // 开始绘制路径
            this.context.lineWidth = 4 // 线条宽度
            this.context.strokeStyle = "#f00" // 描边颜色
            this.context.arc(200, 200, 50, 0, 360) // 绘制弧线路径
            this.context.stroke() // 边框绘制
            this.context.closePath() // 结束绘制路径
          })
      }

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

4.3 画矩形

@Entry
@Component
struct Index {
  // 开启抗锯齿配置
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Column() {
      Canvas(this.context)
        .width('100%')
        .height(360)
        .backgroundColor("#ccc")

      Row() {
        Button("画矩形")
          .onClick(() => {
            this.context.beginPath() // 开始绘制路径
            this.context.lineWidth = 4 // 线条宽度
            this.context.strokeStyle = "#ff0" // 描边颜色
            this.context.fillStyle = "#fff" // 填充颜色
            this.context.rect(150, 150, 100, 100) // 绘制矩形路径
            this.context.stroke() // 边框绘制
            this.context.fill() // 对封闭路径进行填充
            this.context.closePath() // 结束绘制路径
          })
      }

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

4.4 清空画布

@Entry
@Component
struct Index {
  // 开启抗锯齿配置
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Column() {
      Canvas(this.context)
        .width('100%')
        .height(360)
        .backgroundColor("#ccc")

      Row() {
        Button("画矩形")
          .onClick(() => {
            this.context.beginPath() // 开始绘制路径
            this.context.lineWidth = 4 // 线条宽度
            this.context.strokeStyle = "#ff0" // 描边颜色
            this.context.fillStyle = "#fff" // 填充颜色
            this.context.rect(150, 150, 100, 100) // 绘制矩形路径
            this.context.stroke() // 边框绘制
            this.context.fill() // 对封闭路径进行填充
            this.context.closePath() // 结束绘制路径
          })
        Button("清空面板")
          .onClick(() => {
            this.context.clearRect(0, 0, 360, 300)
          })
      }

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

4.5. 绘制时钟

drawImage

drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number): void

drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number, dw: number, dh: number): void

drawImage(image: ImageBitmap | PixelMap, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number):void

进行图像绘制。

rotate

rotate(angle: number): void

针对当前坐标轴进行顺时针旋转。

旋转的是弧度值,可以通过 Math.PI / 180 * 角度 将角度转换为弧度值。

示例
@Entry
@Component
struct Index {
  // 开启抗锯齿配置
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  private clockDial: ImageBitmap = new ImageBitmap('images/clock_dial.png')
  private clockHour: ImageBitmap = new ImageBitmap('images/clock_hour.png')
  private clockMinute: ImageBitmap = new ImageBitmap('images/clock_minute.png')
  private clockSecond: ImageBitmap = new ImageBitmap('images/clock_second.png')

  build() {
    Column() {
      Canvas(this.context)
        .width(300)
        .height(300)
        .onReady(() => {
          // 绘制表盘
          this.context.drawImage(this.clockDial, 0, 0, 300, 300)
          // 移动原点
          this.context.translate(150, 150)

          // 旋转角度,绘制时针
          this.context.rotate(Math.PI / 180 * 90)
          this.context.drawImage(this.clockHour, -2.5, -80, 5, 95)
          this.context.rotate(Math.PI / 180 * -90)

          // 旋转角度,绘制分针
          this.context.rotate(Math.PI / 180 * 30)
          this.context.drawImage(this.clockMinute, -2.5, -110, 5, 125)
          this.context.rotate(Math.PI / 180 * -30)

          // 绘制秒针
          this.context.drawImage(this.clockSecond, -5, -130, 10, 150)
        })
    }
    .width('100%')
    .height('100%')
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1607764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT国内怎么用

2022年11月,OpenAI发布了ChatGPT,这标志着大型语言模型在自然语言处理领域迈出了巨大的一步。ChatGPT不仅在生成文本方面表现出了惊人的流畅度和连贯性,更为人工智能应用开启了全新的可能性。 ChatGPT的推出促进了人工智能技术在多个领域的广…

查看apk是64位32位(三种方法)

通过检查APK文件,你可以确定该APK支持的架构类型,包括它是为64位(例如arm64-v8a、x86_64)还是32位(例如armeabi-v7a、x86)架构准备的。Android应用程序可以包含多个不同的二进制文件,每个文件针…

数组和指针的联系(C语言)

数组和指针是两种不同的数据类型,数组是一种构造类型,用于存储一组相同类型的变量;而指针是一种特殊类型,专门用来存放数据的地址。数组名除了sizeof(数组名)和&数组名表示整个数组外,其他情况下都表示的是首元素的…

说说你对图的理解?相关操作有哪些?

一、是什么 在计算机科学中,图是一种抽象的数据类型,在图中的数据元素通常称为结点,V是所有顶点的集合,E是所有边的集合 如果两个顶点v,w,只能由v向w,而不能由w向v,那么我们就把这种情况叫做一…

Leetcode - 周赛393

目录 一,3114. 替换字符可以得到的最晚时间 二,3115. 素数的最大距离 三,3116. 单面值组合的第 K 小金额 四, 3117. 划分数组得到最小的值之和 一,3114. 替换字符可以得到的最晚时间 本题是一道模拟题,…

有效的括号 + 点击消除 || 匹配问题

目录 点击消除: 有效的括号: 点击消除: 点击消除_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/8d3643ec29654cf8908b5cf3a0479fd5?tpId308&tqId40462&ru/exam/oj 如题目所述, 示例1&#xf…

顺丰同城急送API对接(附源码)

一、背景 最近公司让我对接顺丰同城急送的API,讲讲里面需要注意的几点 官方的API文档有些示例代码也不全,具体细节不多说,如果你现在也需要对接他们API,可以参考本篇博客再配合官方文档结合起来看,可以让您再开发的时…

C++面向对象程序设计-北京大学-郭炜【课程笔记(七)】

C面向对象程序设计-北京大学-郭炜【课程笔记(七)】 1、类型转换运算符2、自增、自减运算符的重载3、继承和派生的基本概念3.1、基本概念3.2、派生类对象的内存空间 4、继承关系和复合关系4.1、继承关系的使用4.2、复合关系的使用 5、派生类覆盖基类成员6…

【分治】Leetcode 数组中的第K个最大元素

题目讲解 数组中的第K个最大元素 算法讲解 堆排序:1. 寻找最后一个节点的父亲,依次向上遍历,完成小堆的建立;2. 从最后一个元素开始,和堆顶的数据做交换,此时最小的数据在对后面,然后对剩下的…

C++设计模式|创建型 4.建造者模式

1.什么是建造者模式? 建造者模式(也被成为生成器模式),是一种创建型设计模式,软件开发过程中有的时候需要创建很复杂的对象,而建造者模式的主要思想是将对象的构建过程分为多个步骤,并为每个步骤定义一个…

OpenHarmony图形处理库—pyclipper [GN编译]

简介 pyclipper是图形处理库,用于剪裁和偏移直线和多边形。 下载安装 直接在OpenHarmony-SIG仓中搜索pyclipper并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的pyclipper库代码存在以下路径:./third_party/pyclipper 修改添加依…

Java 算法篇-深入了解 BF 与 KMP 算法

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 BF 算法概述 1.1 BF 算法实际使用 2.0 KMP 算法概述 2.1 KMP 算法实际使用 2.2 相比于 BF 算法实现,KMP 算法的重要思想 2.3 为什么要这样设计&#x…

ATFX汇市:日元贬值导致进口物价走高,日央行或有二次加息计划

消息面&数据面: 日本央行行长植田和男表示,弱势日元可能影响通胀趋势,如果这样可能导致政策转变。意思是说,随着日元汇率逼近160.00,日元贬值对进口物价的影响越来越明显。如果日元继续保持贬值态势,日…

【Java】文件大小转换工具类(B,KB,MB,G,TB,PB)

说明 使用方法:FileMemoryUtil.prettyByteSize(35871),参数为字节个数 返回结果:保留一位小数的自适应结果(例如:4.1KB)。可以留意在浏览器上下载的文件,会根据文件大小展示不同的单位&#xff…

腾讯面试准备-2024.3.25

腾讯面试准备-2024.3.25 腾讯面试准备-2024.3.25自我介绍C11/14/17新特性C11新特性C14新特性C17新特性 struct和class的区别进程状态现代的流媒体通信协议栈流媒体协议详解extern "C"程序从编译到执行的过程进程、线程、协程进程线程协程 如何实现一个信号与槽系统&a…

【强化学习的数学原理-赵世钰】课程笔记(十)Actor-Critic 方法

目录 一.最简单的 actor-critic(QAC):The simplest actor-critic (QAC) 二.Advantage actor-critic (A2C) 三.Off-policy actor-critic 方法 四. Deterministic actor critic(DPG) Actor-Critic 方法把基于 value 的方法,特别…

maven3.9的settings.xml 内容学习

settings.xml 文件介绍 settings.xml 是 Maven 的配置文件,它允许你自定义 Maven 的行为,比如设置仓库、代理、认证信息等。在 Maven 3.9 中,settings.xml 的结构和内容可能与之前的版本相似,但可能会有一些小的改进或变化。下面…

【码农教程】手把手教你Mockito的使用

一、前期准备&#xff5e; 1、准备工作 <!--mockito依赖--> <dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>2.7.19</version><scope>test</scope> </dependenc…

NASM中的-f选项

2024年4月19日&#xff0c;周五下午 -f选项 在 NASM 中&#xff0c;-f 选项用于指定输出格式或目标文件格式。这个选项允许你告诉 NASM 将汇编代码编译成特定格式的目标文件&#xff0c;以便与特定的操作系统或环境兼容。下面是 -f 选项的一些常见用法和参数&#xff1a; -f …

excel表格怎么设置密码?excel文件加密的两个方法

一、加密码的原理​ Excel加密码的原理主要基于加密算法和密钥管理。当用户为Excel文件或工作表设置密码时&#xff0c;Excel会采用一种加密算法对文件或工作表进行加密处理。这种加密算法通常是对称加密算法&#xff0c;如AES(高级加密标准)或DES(数据加密标准)。 二&#x…