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

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

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

示例代码 --自己画 

@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开发者

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯每日真题 - 第10天

题目&#xff1a;&#xff08;班级活动&#xff09; 题目描述&#xff08;14届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目要求我们找到最小的修改次数&#xff0c;使得任意一名同学的 ID 都与另一名同学的 ID 不相同。可以总结出这是一个寻找“重复数字最少修改…

HTML5实现俄罗斯方块小游戏

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143788449 HTML5实现俄罗斯方块小游戏&#x…

外网访问 WebDav 服务

从外部网络环境&#xff08;比如异地和家中网络&#xff09;来访问公司内网的 WebDav 服务&#xff08;基于 IIS &#xff09;并映射成本地虚拟磁盘。 步骤如下 第一步 在公司内网的电脑上设置 webDav。 1&#xff0c;找到【控制面板】&#xff0c;双击进入。 2&#xff0c…

深度学习每周学习总结J5(DenseNet-121 +SE 算法实战与解析 - 猴痘识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 0. 总结 数据导入及处理部分&#xff1a;本次数据导入没有使用torchvision自带的数据集&#xff0c;需要将原始数据进行处理包括数据导入…

【玩具蛇——DFS】

题目 代码 #include <bits/stdc.h> using namespace std; int g[5][5]; int dx[] {0, 0, -1, 1}, dy[] {-1, 1, 0, 0}; int ans; void dfs(int x, int y, int t) {g[x][y] t;if (t > 16){ans;g[x][y] 0;return;}for (int i 0; i < 4; i){int nx x dx[i], n…

STM32 串口输出调试信息

软硬件信息 CubeMX version 6.12.1Keil uVision V5.41.0.0 注意 串口有多种&#xff1a; TTL232485 串口的相关知识&#xff1a; 01-【HAL库】STM32实现串口打印&#xff08;printf方式) &#xff0c; 内含 TTL 和 232 区别。 我把 232 串口连进 STM32 串口助手收到的信息…

spring-data-elasticsearch 3.2.4 实现桶bucket排序去重,实现指定字段的聚合搜索

一、背景 es索引有一个文档CourseIndex&#xff0c;下面是示意: creatorIdgradesubjectnameno1002270英语听力课程一N00232DS91004380数学口算课程N00209DK71003480物理竞赛课程N00642XS21002280英语听力课程二N00432WS31002290英语听力课程三N002312DP5 在搜索的时候&#…

内容占位符:Kinetic Loader HTML+CSS 使用CSS制作三角形原理

内容占位符 前言 随着我们对HTML和CSS3的学习逐渐深入&#xff0c;相信大家都已经掌握了网页制作的基础知识&#xff0c;包括如何使用HTML标记构建网页结构&#xff0c;以及如何运用CSS样式美化页面。为了进一步巩固和熟练这些技能&#xff0c;今天我们一起来完成一个有趣且实…

【OH】openHarmony开发环境搭建(基于windows子系统WSL)

前言 本文主要介绍基于windows子系统WSL搭建openHarmony开发环境。 WSL与Vmware虚拟机的区别&#xff0c;可以查看WSL与虚拟机的区别 更详细的安装配置过程可参考微软官网&#xff1a; ​安装 WSL 前提 以下基于windows 111专业版进行配置&#xff0c;windows 10应该也是可以…

深入理解 source 和 sh、bash 的区别

1 引言 在日常使用 Linux 的过程中&#xff0c;脚本的执行是不可避免的需求之一&#xff0c;而 source、sh、bash 等命令则是执行脚本的常用方式。尽管这些命令都能运行脚本&#xff0c;但它们之间的执行方式和效果却有着显著的区别。这些区别可能会影响到脚本的环境变量、工作…

LogViewer NLog, Log4Net, Log4j 文本日志可视化

LogViewer 下载 示例&#xff1a;NLog文本日志可视化软件&#xff0c;并且能够实时监听输出最新的日志 nlog.config 通过udp方式传输给LogViewer (udp://ip:port) <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-…

探索 HTML 和 CSS 实现的蜡烛火焰

效果演示 这段代码是一个模拟蜡烛火焰的HTML和CSS代码。它创建了一个具有动态效果的蜡烛火焰动画&#xff0c;包括火焰的摆动、伸缩和光晕的闪烁。 HTML <div class"holder"><div class"candle"><div class"blinking-glow"&g…

vue3【实战】切换全屏【组件封装】FullScreen.vue

效果预览 原理解析 使用 vueUse 里的 useFullscreen() 实现 代码实现 技术方案 vue3 vite UnoCSS vueUse 组件封装 src/components/FullScreen.vue <template><component:is"tag"click"toggle":class"[!isFullscreen ? i-ep:full-sc…

GPT-5 要来了:抢先了解其创新突破

Microsoft 的工程师计划于 2024 年 11 月在 Azure 上部署 Orion (GPT-5)。虽然这一版本不会向公众开放&#xff0c;但其上线被视为人工智能领域的一个重要里程碑&#xff0c;并将产生深远的影响。 文章目录 GPT-5 真的要来了GPT-4 的局限性GPT-5 的创新突破与遗留挑战GPT-5 预期…

C++【深入项目-检测键盘】

神马是检测键盘&#xff0c;就是让编辑器可以检测键盘按下了什么按键&#xff0c;我们先科普复习检测键盘 。 检测键盘需要用到一些函数&#xff0c;请见下&#xff1a; ! KEY_DOWN( 80 ) 这个代码是检测按下键盘上P按键。那80是什么&#xff1f;原来是对应按键的&#xff0…

springboot的依赖实现原理:spring-boot-starter-parent解析

01 dependencyManagement的作用 在使用springboot时我们会在项目pom引入以下配置和依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version> &l…

Thinkphp6视图介绍

一.MVC MVC 软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09; ThinkPHP6 是一个典型的 MVC 架构 控制器—控制器&#xff0c;用于将用户请求转发给相应的Model进行处理&a…

【idea】更换快捷键

因为个人习惯问题需要把快捷键替换一下。我喜欢用CTRLD删除一下&#xff0c;用CTRLY复制一样。恰好这两个快捷键需要互换一下。 打开file——>setting——>Keymap——>Edit Actions 找到CTRLY并且把它删除 找到CTRLD 并且把它删除 鼠标右键添加CTRLY 同样操作在Delet…

Tiktok对接和内容发布申请流程

这段时间在搞AI生成视频&#xff0c;希望用户能一键发布到Tiktok&#xff0c;因此研究了一下Tiktok的开发者申请流程&#xff0c;发现好复杂&#xff0c;同时也发现Tiktok的开发也跟我一样&#xff0c;挺草台班子的 0、流程简述 废话不多说&#xff0c;Tiktok的开发者申请和…

[刷题]入门1.矩阵转置

博客主页&#xff1a;算法歌者本篇专栏&#xff1a;[刷题]您的支持&#xff0c;是我的创作动力。 文章目录 1、题目2、基础3、思路4、结果 1、题目 链接&#xff1a;洛谷-B2106-矩阵转置 2、基础 此题目主要考察二维数组的掌控能力。 3、思路 观察&#xff0c;可知&#…