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

news2024/11/16 7:30:58

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

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

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

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

相关文章

C语言.冒泡排序的练习

题目&#xff1a; 1.用C语言编程&#xff0c;用冒泡排序将一个元素个数为20&#xff0c;的一维数组&#xff0c;由大到小的降序。 分析&#xff1a;1.首先创建一个数组&#xff0c;元素个数为20. 2.其次是按降序排列。 3.最后用冒泡排序。 运行代码&#xff1a; #include&l…

RT-DETR融合GhostModel V3及相关改进思路

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《GhostNetV3: Exploring the Training Strategies for Compact Models》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/pdf/2404.11202v1 代码链接&#xff1a;https:…

基于yolov8、yolov5的鸟类分类系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…

如何保证MySQL与Redis缓存的数据一致性?

文章目录 一、引言二、场景来源三、高并发解决方案1. 先更新缓存&#xff0c;再更新数据库2. 先更新数据库&#xff0c;再更新缓存3. 先删除缓存&#xff0c;再更新数据库4. 先更新数据库&#xff0c;再删除缓存小结 四、拓展方案1. 分布式锁与分布式事务2. 消息队列3. 监听bin…

Chromium 中sqlite数据库操作演示c++

本文主要演示sqlite数据库 增删改查创建数据库以及数据库表的基本操作&#xff0c;仅供学习参考。 一、sqlite数据库操作类封装&#xff1a; sql\database.h sql\database.cc // Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-sty…

pycharm分支提交操作

一、Pycharm拉取Git远程仓库代码 1、点击VCS > Get from Version Control 2、输入git的url&#xff0c;选择自己的项目路径 3、点击Clone&#xff0c;就拉取成功了 默认签出分支为main 选择develop签出即可进行开发工作 二、创建分支&#xff08;非必要可以不使用&#xf…

河道无人机雷达测流监测系统由哪几部分组成?

在现代水利管理中&#xff0c;河道无人机雷达监测系统正逐渐成为一种重要的工具&#xff0c;为河道的安全和管理提供了强大的技术支持。那么&#xff0c;这个先进的监测系统究竟由哪几部分组成呢&#xff1f; 河道无人机雷达监测系统工作原理 雷达传感器通过发射电磁波或激光束…

使用pycrawlers下载huggingface报错list index out of range问题解决

使用pycrawlers下载huggingface失败 错误&#xff1a;list index out of range 问题描述&#xff1a;当批量下载整个huggingface仓库的时候会报错&#xff0c;并且没有报错提示 分析&#xff1a;应该是哪个链接请求结果不存在数据 结果&#xff1a;当下载仓库存在文件夹下面只…

清华大学提出基于ESKF的松耦合里程计RINO:一种具有非迭代估计的精确、稳健的雷达惯性里程计

Abstract 精确的定位和建图对于实现自动驾驶车辆的自主导航至关重要。然而&#xff0c;当GNSS信号失效或在极端天气条件&#xff08;例如雾、雨和雪&#xff09;下&#xff0c;车体运动估计仍然面临重大挑战。近年来&#xff0c;扫描雷达因其较强的穿透能力成为一种有效的解决…

微信小程序之路由跳转传数据及接收

跳转并传id或者对象 1.home/index.wxml <!--点击goto方法 将spu_id传过去--> <view class"item" bind:tap"goto" data-id"{{item.spu_id}}"> 结果: 2.home/index.js goto(event){// 路由跳转页面,并把id传传过去//获取商品idlet i…

tensorflow案例6--基于VGG16的猫狗识别(准确率99.8%+),以及tqdm、train_on_batch的简介

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 本次还是学习API和如何搭建神经网络为主&#xff0c;这一次用VGG16去对猫狗分类&#xff0c;效果还是很好的&#xff0c;达到了99.8% 文章目录 1、tqdm…

海康大华宇视视频平台EasyCVR私有化视频平台服务器选购主要参数有哪些?

在构建现代服务器和视频监控系统时&#xff0c;选择合适的硬件配置和关键技术是确保系统性能和稳定性的基础。服务器选购涉及到多个关键参数&#xff0c;这些参数直接影响到服务器的处理能力、数据存储、网络通信等多个方面。 同时&#xff0c;随着视频监控技术的发展&#xf…

Redisson的可重入锁

初始状态&#xff1a; 表示系统或资源在没有线程持有锁的情况下的状态&#xff0c;任何线程都可以尝试获取锁。 线程 1 获得锁&#xff1a; 线程 1 首次获取了锁并进入受保护的代码区域。 线程 1 再次请求锁&#xff1a; 在持有锁的情况下&#xff0c;线程 1 再次请求锁&a…

Java-01 深入浅出 MyBatis - MyBatis 概念 ORM映射关系 常见ORM 详细发展历史

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

C语言第13节:指针(3)

1. 回调函数 回调函数的基本思想是&#xff0c;将函数指针作为参数传递给另一个函数&#xff0c;并在需要时通过这个函数指针调用对应的函数。这种方式允许一个函数对执行的内容进行控制&#xff0c;而不需要知道具体的实现细节。 回调函数在以下场景中尤为有用&#xff1a; …

Tensorflow基本概念

简介&#xff1a;本文从Graph讲到Session&#xff0c;同时讲解了tf.constant创建tensor的用法和variable需要初始化的知识点&#xff0c;可以给你打好一个学习Tensorflow的基础。本文都是基于TensorFlow1.14.0的版本下运行。 本专栏将会系统的讲解TensorFlow在1.14.0版本下的各…

【包教包会】CocosCreator3.x框架——带翻页特效的场景切换

一、效果演示 二、如何获取 1、https://gitee.com/szrpf/TurnPage 2 2、解压&#xff0c;导入cocos creator&#xff08;版本3.8.2&#xff09;&#xff0c;可以直接运行Demo演示 三、算法思路 1、单场景 页面预制体 通过loadScene来切换页面&#xff0c;无法实现页面特效…

【MySQL 保姆级教学】事务的自动提交和手动提交(重点)--上(13)

目录 1. 什么是事务&#xff1f;2. 事务的版本支持3. 事务提交的方式3.1 事务提交方式的分类3.2 演示的准备的工作3.2.1 创建表3.2.2 MySQL的服务端和客户端3.2.3 调低事务的隔离级别 4. 手动提交4.1 手动提交的命令说明4.2 示例一4.3 示例二4.4 示例三4.5 示例四 5. 自动提交5…

几何合理的分片段感知的3D分子生成 FragGen - 评测

FragGen 来源于 2024 年 3 月 25 日 预印本的文章&#xff0c;文章题目是 Deep Geometry Handling and Fragment-wise Molecular 3D Graph Generation&#xff0c; 作者是 Odin Zhang&#xff0c;侯廷军&#xff0c;浙江大学药学院。FragGen 是一个基于分子片段的 3D 分子生成模…

数据结构笔记(其八)--一般树的存储及其遍历

1.知识总览 一般的树会有多个孩子&#xff0c;所以存储结构也会与二叉树略有不同。 一般树的遍历。 2.双亲表示法 双亲表示法&#xff0c;也是父亲表示法&#xff0c;即每个节点中都存储了其父节点的地址信息。 特性&#xff1a;可以轻易地找到父节点&#xff0c;但寻找孩子节…