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

embedded/2024/11/17 0:56:30/

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

Canvas

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

接口

Canvas

Canvas(context?: CanvasRenderingContext2D | DrawingRenderingContext)

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

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

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

参数:

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

Canvas12+

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

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

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

参数:

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

属性

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

enableAnalyzer12+

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

需要搭配context中的StartImageAnalyzer和StopImageAnalyzer一起使用。

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

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

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

参数:

参数名类型必填说明
enableboolean

组件支持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事件后触发。


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

@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%')}
}

 

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

@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%')}
}

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

@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,0this.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 = 10this.context.strokeStyle = Color.Whitethis.context.stroke()})}.width('100%').height('100%')}
}

示例代码 --自己画 

@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 = 10this.context.strokeStyle = Color.Whiteif (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开发者


http://www.ppmy.cn/embedded/138137.html

相关文章

说说TCP传输的三次握手四次挥手策略

TCP&#xff08;传输控制协议&#xff09;是一个面向连接、可靠的传输层协议。在建立和关闭连接时&#xff0c;TCP使用“三次握手”和“四次挥手”机制来确保可靠的通信。下面我们详细讲解这两个过程&#xff1a; 一、三次握手&#xff08;TCP连接建立&#xff09; 三次握手是…

我的docker随笔45:在龙芯平台安装docker

本文介绍在龙芯平台安装docker。 前言 2017年下半年开始接触docker时&#xff0c;那会李大锤刚刚会爬&#xff0c;而今年&#xff08;2024年&#xff09;下半年&#xff0c;李大锤已经是一个经常考得C并且经常和妹妹吵架的二年级学生了。这么多年就过去&#xff0c;docker一直…

Rust 数据类型

Rust 数据类型 Rust 是一种系统编程语言,以其内存安全性、速度和并发性而闻名。Rust 的设计理念是“零成本抽象”,这意味着它提供了高级语言的便利性,同时保持了接近低级语言的性能。Rust 的数据类型系统是其核心特性之一,它包括了几种不同的类型,用于处理各种编程场景。…

oneplus6-编译-LineageOS-19.1-android12

lineage-19.1/oneplus6-build.md 修复内核崩溃 经过此两修改后, 编译出的OTA包 刷入手机, 手机重启正常越过logo 进入android, 但卡在LineageOS-19的弧形进度界面, 没有此两修改时, 根本进不到android, 只到开机logo就黑屏 亮呼吸灯 , 串口处于900E(高通ramdump模式), 因此…

CSS Module:告别类名冲突,拥抱模块化样式(5)

CSS Module 是一种解决 CSS 类名冲突的全新思路。它通过构建工具&#xff08;如 webpack&#xff09;将 CSS 样式切分为更加精细的模块&#xff0c;并在编译时将类名转换为唯一的标识符&#xff0c;从而避免类名冲突。本文将详细介绍 CSS Module 的实现原理和使用方法。 1. 思…

第三次作业

1.在/home中创建一个名为 file1.txt 的文件&#xff0c;并设置权限为&#xff1a;所有者和组成员可以读写&#xff0c;但其他人只能读。 [rootlocalhost home]# touch file1.txt [rootlocalhost home]# ll -rw-r--r--. 1 root root 0 11月 11 23:06 file1.txt [rootlo…

深入探索Waymo自动驾驶技术发展:从DARPA挑战赛到第五代系统的突破

引言 自动驾驶技术正引领着未来出行方式的革命&#xff0c;而Waymo作为全球自动驾驶领域的先锋&#xff0c;始终走在技术发展的最前沿。本文基于Waymo联席CEO德米特里多尔戈夫&#xff08;Dmitri Dolgov&#xff09;在No Priors节目中的访谈&#xff0c;全面介绍Waymo的技术发展…

【EasyExcel等比例缩小导出图片】

EasyExcel等比例缩小导出图片 一、背景二、思路三、代码 一、背景 使用EasyExcel导出excel文件&#xff0c;但是需要同时导出图片信息&#xff0c;且图片信息不能影响行高和单元格宽度&#xff0c;图片本身被导出时&#xff0c;不能因为压缩导致图片变形 二、思路 使用EasyE…