鸿蒙开发-UI-图形-绘制自定义图形

news2024/11/13 12:51:31

鸿蒙开发-UI-组件

鸿蒙开发-UI-组件2

鸿蒙开发-UI-组件3

鸿蒙开发-UI-气泡/菜单

鸿蒙开发-UI-页面路由

鸿蒙开发-UI-组件导航-Navigation

鸿蒙开发-UI-组件导航-Tabs

鸿蒙开发-UI-图形-图片

鸿蒙开发-UI-图形-绘制几何图形

文章目录

前言

一、使用画布组件绘制自定义图形

1.初始化画布组件

3.画布组件常用方法

1.基础形状绘制

2.文本绘制

3.绘制图片和图像像素信息处理

4.其他方法

二、场景示例

1.绘制基础图形

2.绘制不规则图形

3.绘制图片和图像像素信息处理

总结


前言

上文学习了鸿蒙开发UI显示图形关于几何图形绘制的相关知识,了解了相关图形绘制组件以及两种绘制方式,同时学习了形状视口来做图形的缩放效果,本文将学习使用画布绘制自定义图形

一、使用画布组件绘制自定义图形

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

CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象在Canvas组件上进行绘制,绘制对象可以是基础形状、文本、图片等,有三种形式在画布绘制自定义图形

1. 使用CanvasRenderingContext2D对象在Canvas画布上绘制

2. 离屏绘制,将需要绘制的内容先绘制在缓存区,再将其转换成图片绘制到Canvas上,首先通过transferToImageBitmap方法将离屏画布最近渲染的图像创建为一个ImageBitmap对象,然后通过CanvasRenderingContext2D对象的transferFromImageBitmap方法显示给定的ImageBitmap对象,使用案例参考场景示例中第三个绘制图片和图像像素信息处理

3.在Canvas上加载Lottie动画时,需要先下载Lottie

1.初始化画布组件

onReady(event: () => void)是Canvas组件初始化完成时的事件回调

调用该事件后,可获取Canvas组件的确定宽高,进一步使用CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象调用相关API进行图形绘制

Canvas(this.context)
  .width('100%')
  .height('100%')
  .backgroundColor('#F5DC62')
  .onReady(() => {
    this.context.fillStyle = '#0097D4';
    this.context.fillRect(50, 50, 100, 100);
  })

2.画布组件绘制方式

Canvas组件生命周期接口onReady()调用之后,开发者绘制有两种方式

1.通过CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象直接调用相关API进行绘制

//用来配置CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象的参数,包括是否开启抗锯齿。true表明开启抗锯齿
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

Canvas(this.context)
  .width('100%')
  .height('100%')
  .backgroundColor('#F5DC62')
  .onReady(() =>{
    this.context.beginPath();
    this.context.moveTo(50, 50);
    this.context.lineTo(280, 160);
    this.context.stroke();
   })

2.先单独定义path2d对象构造理想的路径,再通过调用CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象的stroke接口或者fill接口进行绘制

//用来配置CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象的参数,包括是否开启抗锯齿。true表明开启抗锯齿
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

Canvas(this.context)
  .width('100%')
  .height('100%')
  .backgroundColor('#F5DC62')
  .onReady(() =>{
     let region = new Path2D();
     region.arc(100, 75, 50, 0, 6.28);
     this.context.stroke(region);
  })

3.画布组件常用方法

1.基础形状绘制

可以通过arc(绘制弧线路径)、 ellipse(绘制一个椭圆)、rect(创建矩形路径)等接口绘制基础形状

Canvas(this.context)
  .width('100%')
  .height('100%')
  .backgroundColor('#F5DC62')
  .onReady(() =>{
     //绘制矩形
     this.context.beginPath();
     this.context.rect(100, 50, 100, 100);
     this.context.stroke();
     //绘制圆形
     this.context.beginPath();
     this.context.arc(150, 250, 50, 0, 6.28);
     this.context.stroke();
     //绘制椭圆
     this.context.beginPath();
     this.context.ellipse(150, 450, 50, 100, Math.PI * 0.25, Math.PI * 0, Math.PI * 2);
     this.context.stroke();
  })

2.文本绘制

可以通过fillText(绘制填充类文本)、strokeText(绘制描边类文本)等接口进行文本绘制

Canvas(this.context)
  .width('100%')
  .height('100%')
  .backgroundColor('#F5DC62')
  .onReady(() =>{
     //绘制填充类文本
     this.context.font = '50px sans-serif';
     this.context.fillText("Hello World!", 50, 100);
     //绘制描边类文本
     this.context.font = '55px sans-serif';
     this.context.strokeText("Hello World!", 50, 150);
  })

3.绘制图片和图像像素信息处理

通过drawImage(图像绘制)、putImageData(使用ImageData数据填充新的矩形区域)等接口绘制图片

通过createImageData(创建新的ImageData 对象)、getPixelMap(以当前canvas指定区域内的像素创建PixelMap对象)、getImageData(以当前canvas指定区域内的像素创建ImageData对象)等接口进行图像像素信息处理

4.其他方法

渐变(CanvasGradient对象)相关的方法:createLinearGradient(创建一个线性渐变色)、createRadialGradient(创建一个径向渐变色)等

Canvas(this.context)
  .width('100%')
  .height('100%')
  .backgroundColor('#F5DC62')
  .onReady(() =>{
     //创建一个径向渐变色的CanvasGradient对象
     let grad = this.context.createRadialGradient(200,200,50, 200,200,200)
     //为CanvasGradient对象设置渐变断点值,包括偏移和颜色
     grad.addColorStop(0.0, '#E87361');
     grad.addColorStop(0.5, '#FFFFF0');
     grad.addColorStop(1.0, '#BDDB69');
     //用CanvasGradient对象填充矩形
     this.context.fillStyle = grad;
     this.context.fillRect(0, 0, 400, 400);
  })

二、场景示例

1.绘制基础图形

@Entry
@Component
struct ClearRect {
//step1: 定义CanvasRenderingContext2D对象参数并创建一个对象用于绘图,
 private settings: RenderingContextSettings = new RenderingContextSettings(true);
 private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);

 
  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#F5DC62')
        .onReady(() =>{
//step2:Canvas组件初始化后,回调函数中绘制图形,设定填充样式,填充颜色设为蓝色
          this.context.fillStyle = '#0097D4';
//step3:以(50, 50)为左上顶点,画一个宽高200的矩形,该矩形填充颜色为step2设置颜色
          this.context.fillRect(50,50,200,200);
//setp4:以(70, 70)为左上顶点,清除宽150高100的区域
          this.context.clearRect(70,70,150,100);
      })
    }
    .width('100%')
    .height('100%')
  }
}

UI渲染

2.绘制不规则图形

@Entry
@Component
struct Path2d {
//step1:创建CanvasRenderingContext2D对象用户绘制图形
  private settings: RenderingContextSettings = new RenderingContextSettings(true);
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);

  build() {
    Row() {
      Column() {
        Canvas(this.context)
          .width('100%')
          .height('100%')
          .backgroundColor('#F5DC62')
          .onReady(() =>{
//step2:使用Path2D的接口构造一个五边形
            let path = new Path2D();
            path.moveTo(150, 50);
            path.lineTo(50, 150);
            path.lineTo(100, 250);
            path.lineTo(200, 250);
            path.lineTo(250, 150);
            path.closePath();
//step3:设定填充色为蓝色
            this.context.fillStyle = '#0097D4';
//step4:使用step3设置的填充方式,将Path2D描述的五边形绘制在canvas组件内部
            this.context.fill(path);
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

UI渲染

3.绘制图片和图像像素信息处理

@Entry
@Component
struct GetImageData {
//step1:定义CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象
 private settings: RenderingContextSettings = new RenderingContextSettings(true)
 private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
 private offContext: OffscreenCanvasRenderingContext2D = new OffscreenCanvasRenderingContext2D(600, 600, this.settings)
//step2:定义接收离屏绘制的图像对象,用于绘制到canvas组件上
 private img:ImageBitmap = new ImageBitmap("/common/images/1234.png")
 
  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#F5DC62')
        .onReady(() =>{
//step3:调用drawImage接口将图片画在(0,0)为起点,宽高130的区域
          this.offContext.drawImage(this.img,0,0,130,130);
//step4:调用getImageData接口,获得canvas组件区域中,(50,50)为起点,宽高130范围内的绘制内容
          let imagedata = this.offContext.getImageData(50,50,130,130);
//step5:调用putImageData接口将得到的ImageData画在起点为(150, 150)的区域中
          this.offContext.putImageData(imagedata,150,150);
//step6:将离屏绘制的内容画到canvas组件上
          let image = this.offContext.transferToImageBitmap();
          this.context.transferFromImageBitmap(image);
        })
    }
    .width('100%')
    .height('100%')
  }
}

 UI渲染

总结

本文详细学习了鸿蒙开发UI使用画布绘制自定义图形的相关知识,了解画布绘制的三种方式,同时学习了画布组件的常用用法,以及如何绘制规则、不规则图形、图片图像等,下文将学习鸿蒙开发UI动画

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

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

相关文章

select,poll和epoll有什么区别

它们都是NIO中多路复用的三种实现机制,是由linux操作系统提供的。 用户空间和内核空间:操作系统为了保证系统安全,将内核分为两个部分,一个是用户空间,一个是内核空间。用户空间不能直接访问底层的硬件设备&#xff0…

SpringCloud-同步异步通讯比较

本文详细探讨了同步通讯和异步通讯在信息传递中的区别,以及它们分别带来的优势和不足。通过对支付流程的案例分析,突显了同步通讯可能面临的阻塞和服务依赖问题,而异步通讯通过引入事件驱动模式和消息代理(Broker)成功…

HarmonyOS-卡片事件能力说明

卡片事件能力说明 ArkTS卡片中提供了postCardAction()接口用于卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件,仅在卡片中可以调用。 接口定义:postCardAction(component: Object, action: Object): void 接口…

QPS 提升 10 倍!滴滴借助 StarRocks 物化视图实现低成本精确去重

作者:滴滴 OLAP 开发工程师 刘雨飞 小编导读: 滴滴于 2022 年引入了 StarRocks。经过一年多的努力,StarRocks 逐渐替代了原有技术栈,成为滴滴内部主要的 OLAP 引擎。截至 2023 年 12 月,滴滴已经成功建立了超过 40 个 …

STM32------分析GPIO寄存器

一、初始LED原理图 共阴极led LED发光二极管,需要有电流通过才能点亮,当有电压差就会产生电流 二极管两端的电压差超过2.7v就会有电流通过 电阻的作用 由于公式IV/R 不加电阻容易造成瞬间电流无穷大 发光二极管工作电流为10-20MA 3.3v / 1kΩ 3.…

MariaDB MaxScale实现mysql8读写分离

目录 1.MaxScale 是干什么的? 2.MaxScale 实验环境 3.实现数据库主从复制 4.创建用户 1) 创建监控用户 2) 创建路由用户 5.docker 安装MaxScale 6.配置maxscale 使用 maxctrl list servers 命令查看运行状态 查看注册服务 使用 maxctrl list listeners Read-…

Javaweb之SpringBootWeb案例之自动配置以及常见方案的详细解析

3.2 自动配置 我们讲解了SpringBoot当中起步依赖的原理,就是Maven的依赖传递。接下来我们解析下自动配置的原理,我们要分析自动配置的原理,首先要知道什么是自动配置。 3.2.1 概述 SpringBoot的自动配置就是当Spring容器启动后&#xff0c…

查看cuda和cudnn版本

查看cuda 打开命令提示符(Windows键 R,然后输入cmd并回车)。输入nvcc --version或者nvcc -V来获取Cuda的版本信息。 查看cudnn版本 查看Cudnn版本: 进入Cuda安装目录,通常位于C:\Program Files\NVIDIA GPU Computi…

网络卡顿是怎么回事?

网络卡顿是指在网络通信过程中,数据传输出现延迟或中断,导致用户在使用网络时出现卡顿、延迟或不流畅的情况。例如:系统响应时间长,网页加载速度慢;视频或游戏掉帧,导致画面卡顿或不流畅;音视频…

windows系统安装《植物大战僵尸2009原版》教程

本文演示如何在windows免费安装 植物大战僵尸2009原版。 首先到 点此下载安装包 此页面最末端下载百度网盘分享的安装包。 下载完成后安装如下步骤进行安装: 安装完成即可开心的玩耍啦! 我自己的安装过程录屏在这里 https://www.bilibili.com/vid…

信号系统之快速傅里叶变换

1 使用复数DFT的实数DFT 本文的主题,如何使用 FFT 计算真正的 DFT? 由于 FFT 是一种用于计算复数 DFT 的算法,因此了解如何将实数 DFT 数据输入和输出复数 DFT 格式非常重要。图 12-1 比较了实数 DFT 和复数 DFT 存储数据的方式。实数 DFT …

vue自定义实现icon选择器

<template> <div> <span class"iconStyle" click"selectIcon"> <i :class"value" /> </span> <div class"iconTitle">选择图标</div> <el-dialog title"" :visible.sync"…

一周学会Django5 Python Web开发-会话管理(CookiesSession)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计26条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

力扣:9. 回文数

力扣&#xff1a;9. 回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xf…

jvm面试题-背诵版

按照思维导图抽查和记忆&#xff0c;答案见&#xff1a;四、面试-多线程/并发_scheduledfuture释放-CSDN博客

初学者如何使用QT新建一个包含UI界面的C++项目

文章目录 一、下载并安装QT51、下载安装包2、注册/登录账号3、安装qt6 二、新建QT Widget项目1、新建项目并且运行2、易错点&#xff1a;可能运行成功得到UI界面但是会报错&#xff08;原因是使用了中文路径&#xff09; 一、下载并安装QT5 1、下载安装包 进入下载网址 Windo…

javascript中的class基础入门(1)

javascript中的class start 最近在学习&#xff1a;cocos &#xff0c;准备自己制作小游戏。过程中遇到不少疑问&#xff0c;我计划将这些疑问写成一个系列博客&#xff0c;用以记录。这篇文章来了解 class 1. 前言 1. 前言 本文对应版本 Cocos Creator 3.8。Cocos Creato…

Pytest中测试结果收集:pytest_terminal_summary!

前言 Pytest是Python的一种强大的测试框架&#xff0c;它提供了丰富的功能和插件来满足各种测试需求。 其中&#xff0c;pytest_terminal_summary是一个钩子函数&#xff0c;它允许我们在测试运行结束后&#xff0c;添加自定义的总结信息到测试报告中。这个功能在需要对测试结…

Java 小项目开发日记 04(文章接口的开发、oss图片上传)

Java 小项目开发日记 04&#xff08;文章接口的开发、oss图片上传&#xff09; 项目目录 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

HMAC算法

HMAC HMAC可以用来加密、数字签名、报文验证等。 1. 消息认证码 消息认证码&#xff08;Message Authentication Code&#xff0c;MAC&#xff09;是基于消息和秘钥的公开函数&#xff0c;输出为定长数据&#xff1a; MACC(M,K) 假定通信双发共享秘钥K&#xff0c;发送方A向接…