当前位置: 首页 > ds >正文

鸿蒙Next图形绘制指南:从基础几何图形到复杂UI设计

探索HarmonyOS的强大图形绘制能力,打造精美视觉效果

HarmonyOS(鸿蒙操作系统)是华为推出的全场景分布式操作系统,其强大的图形绘制能力为开发者提供了丰富的创意空间。今天我们将深入探讨如何在鸿蒙Next中使用各种技术绘制几何图形,为您的应用增添视觉魅力。

1 鸿蒙图形绘制基础

在鸿蒙开发中,图形绘制是一个基础且重要的部分,它允许开发者在应用中创建直观且吸引人的视觉效果。

绘制组件用于在页面绘制图形,Shape组件是绘制组件的父组件,父组件中会描述所有绘制组件均支持的通用属性。

鸿蒙系统不仅支持多种设备类型,还提供了丰富的API来实现各种功能。图形绘制API设计简洁易用,同时提供了强大的自定义能力,让开发者能够轻松创建从简单到复杂的各种图形。

2 两种创建绘制组件的方式

2.1 使用Shape作为父组件

使用Shape作为父组件可以实现类似SVG的效果。这种方式适用于需要组合多个图形元素的复杂场景。

javascript

// 创建带有父组件的绘制组件
Shape() {Rect().width(300).height(50)Circle({ width: 150, height: 150 }).fill('red')
}

上述代码创建了一个包含矩形和圆形的图形组合,其中Shape作为容器,Rect和Circle作为子组件。

2.2 绘制组件单独使用

绘制组件也可以单独使用,用于在页面上绘制指定的图形。鸿蒙提供了7种基本绘制类型:

  • Circle(圆形)

  • Ellipse(椭圆形)

  • Line(直线)

  • Polyline(折线)

  • Polygon(多边形)

  • Path(路径)

  • Rect(矩形)

以绘制圆形为例:

javascript

// 单独使用Circle组件绘制圆形
Circle({ width: 150, height: 150 })

这种方式简单直接,适用于只需要绘制单一图形的场景。

3 理解形状视口(viewport)

形状视口viewport指定用户空间中的一个矩形,该矩形映射到为关联的SVG元素建立的视区边界。viewport属性的值包含x、y、width和height四个可选参数,x和y表示视区的左上角坐标,width和height表示其尺寸。

3.1 通过viewport对图形进行放大与缩小

javascript

// 通过viewport对图形进行缩放
Row({space:10}) {Column() {// 放大的Circle组件Text('shape内放大的Circle组件')Shape() {Rect().width('100%').height('100%').fill('#0097D4')Circle({width: 75, height: 75}).fill('#E87361')}.viewPort({x: 0, y: 0, width: 75, height: 75}).width(150).height(150).backgroundColor('#F5DC62')}Column() {// 缩小的Circle组件Text('Shape内缩小的Circle组件')Shape() {Rect().width('100%').height('100%').fill('#BDDB69')Circle({width: 75, height: 75}).fill('#E87361')}.viewPort({x: 0, y: 0, width: 300, height: 300}).width(150).height(150).backgroundColor('#F5DC62')}
}

上面的例子中,Shape的宽和高都是150px,同时Circle的尺寸也都是75px。

  • 左边的图片中,由于视口大小为75,因此Circle刚好占满整个视口,而Shape的尺寸是150px,同时Circle占满了整个视口,所以最终圆形的显示尺寸就是150px。

  • 右边的图片中,由于视口大小为300,因此Circle在整个视口中只占 1/4,在最终显示时,Circle尺寸则只有150/4,即37.5px(原尺寸的一半)。

3.2 使用viewport平移图形

javascript

// 创建平移效果的viewport
Shape() {Rect().width("100%").height("100%").fill("#0097D4")Circle({ width: 150, height: 150 }).fill("#E87361")
}
.viewPort({ x: -150, y: -150, width: 300, height: 300 })
.width(300)
.height(300)
.backgroundColor("#F5DC62")

此代码将viewport向右方和下方各平移150单位,从而实现图形位置的调整。

4 自定义图形样式

鸿蒙提供了丰富的属性来自定义图形样式,让开发者能够创建各种视觉效果。

4.1 填充与边框设置

javascript

// 设置填充和边框样式
Path().width(100).height(100).commands('M150 0 L300 300 L0 300 Z').fill("#E87361") // 填充颜色.stroke(Color.Red) // 边框颜色.strokeWidth(10) // 边框宽度.strokeOpacity(0.2) // 边框透明度

4.2 线条样式设置

javascript

// 设置线条样式
Polyline().width(100).height(100).fillOpacity(0).stroke(Color.Red).strokeWidth(8).points([[20, 0], [0, 100], [100, 90]]).strokeLineJoin(LineJoinStyle.Round) // 设置折线拐角处为圆弧

鸿蒙支持多种线条拐角绘制样式:

  • Bevel:使用斜角连接路径段

  • Miter:使用尖角连接路径段

  • Round:使用圆角连接路径段

4.3 高级样式设置

javascript

// 高级样式设置示例
Path().width(200).height(60).commands('M0 0 L400 0 L400 150 Z').viewPort({ x: -80, y: -5, width: 500, height: 300 }).fill(0x317AF7).stroke(Color.Red).strokeWidth(3).strokeLineJoin(LineJoinStyle.Miter).strokeMiterLimit(5)

5 使用Canvas绘制自定义图形

除了使用Shape组件外,鸿蒙还提供了Canvas组件用于更灵活的自定义图形绘制。

5.1 初始化画布组件

javascript

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

onReady事件在Canvas组件初始化完成时触发,调用该事件后,可获取Canvas组件的确定宽高,进一步使用CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象调用相关API进行图形绘制。

5.2 画布绘制方式

鸿蒙提供两种画布绘制方式:

方式一:直接调用API进行绘制

javascript

// 直接调用API进行绘制
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();})

方式二:使用Path2D对象定义路径

javascript

// 使用Path2D对象定义路径
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);})

5.3 绘制基础形状

javascript

// 使用Canvas绘制基础形状
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();})

6 矩形绘制的多种实现方式

在鸿蒙中,绘制矩形有多种实现方式,可以根据具体需求选择合适的方法。

6.1 使用Rect组件绘制矩形

javascript

// 使用Rect组件绘制矩形
Rect().width(100).height(100).fill(Color.Pink) // 填充颜色.stroke(Color.Red) // 边框颜色.strokeWidth(2) // 边框宽度.radius(10) // 圆角半径

Rect组件支持多种属性:

  • width:宽度,取值范围≥0

  • height:高度,取值范围≥0

  • radius:圆角半径,支持分别设置四个角的圆角度数,取值范围≥0

  • fill:设置填充区域的颜色

  • stroke:设置边框颜色

  • strokeWidth:设置边框宽度

6.2 实现圆角矩形

javascript

// 实现圆角矩形
Rect().width(100).height(100).fill(Color.Pink).radius(10) // 统一设置所有圆角// 分别设置不同圆角
Rect().width(100).height(100).fill(Color.Pink).radius([[10, 10], [10, 10], [0, 0], [0, 0]]) // 左上、右上、右下、左下

6.3 实现渐变矩形

javascript

// 实现渐变矩形
Rect().width(100).height(100).fillOpacity(0).linearGradient({direction: GradientDirection.Right,colors: [[Color.Red, 0.0], [Color.Orange, 0.3], [Color.Pink, 1.0]]})

7 实际应用场景

7.1 绘制基础图形组合

javascript

// 绘制基础图形组合
@Entry
@Component
struct ShapeExample {build() {Column({ space: 10 }) {Shape() {Path().width(200).height(60).commands('M0 0 L400 0 L400 150 Z')}.viewPort({ x: -80, y: -5, width: 500, height: 300 }).fill(0x317AF7).stroke(Color.Red).strokeWidth(3).strokeLineJoin(LineJoinStyle.Miter).strokeMiterLimit(5)}.width('100%').margin({ top: 15 })}
}

7.2 绘制CAD风格图形

在HarmonyOS鸿蒙Next中绘制CAD图形,可以通过以下步骤实现:

  1. 使用直线命令画三条水平直线和一条垂直直线

  2. 使用旋转和镜像命令创建对称图形

  3. 使用偏移命令创建平行线

  4. 使用修剪命令完善图形

javascript

// 使用Canvas绘制CAD风格图形
Canvas(this.context).width('100%').height('100%').onReady(() => {// 绘制基本线条this.context.beginPath();this.context.moveTo(50, 50);this.context.lineTo(200, 50);this.context.lineTo(200, 150);this.context.lineTo(50, 150);this.context.closePath();this.context.stroke();// 绘制圆形元素this.context.beginPath();this.context.arc(125, 100, 30, 0, Math.PI * 2);this.context.stroke();})

8 性能优化与最佳实践

为了确保图形绘制的最佳性能和用户体验,建议遵循以下准则:

  1. 合理使用视口:正确配置viewport可以优化渲染性能

  2. 选择合适的绘制方式:简单图形使用Shape组件,复杂图形考虑使用Canvas

  3. 复用图形对象:尽可能复用已有的图形对象,减少内存占用

  4. 使用离线画布:对于复杂图形,可以使用OffscreenCanvas进行预处理

  5. 优化绘制指令:减少不必要的绘制操作,提高渲染效率

结语

鸿蒙OS提供了强大而灵活的图形绘制能力,从基本几何图形到复杂自定义图形都能轻松应对。通过本文的介绍,相信您已经对鸿蒙Next中的图形绘制有了全面了解。无论是简单的矩形、圆形,还是复杂的CAD风格图形,都能通过合适的组件和API实现。

希望本篇博客能为您的鸿蒙开发之旅提供帮助,祝您创作出更多精美的视觉作品!

http://www.xdnf.cn/news/20018.html

相关文章:

  • vue3 vite 自适应方案
  • Java+AI开发实战与知识点归纳系列:Spring流式输出实战——LangChain4j与Ollama集成
  • 2025 大数据时代值得考的证书排名前八​
  • TypeScript与JavaScript:从动态少年到稳重青年的成长之路
  • “企业版维基百科”Confluence
  • STM32 - Embedded IDE - GCC - 如何在工程中定义一段 NoInit RAM 内存
  • 爬取m3u8视频完整教程
  • JavaWeb项目在服务器部署
  • 数据结构之----线性表其一---顺序表
  • 弱电太累,职业发展遇瓶颈?那一定不要错过这个技能!
  • 单片机(89C51)---基础知识
  • 阅兵时刻,耐达讯自动化RS485 转 Profinet 网关助力矿山冶金连接迈向辉煌
  • 【大数据技术实战】Flink+DS+Dinky 自动化构建数仓平台
  • 嵌入式 Linux 启动流程详解 (以 ARM + U-Boot 为例)
  • 【ShiMetaPi M4-R1】上手:RK3568B2|开源鸿蒙(OpenHarmony) 应用开发快速上手
  • Vue+Echarts饼图深度美化指南:打造卓越数据可视化体验
  • 深入理解 Java 集合框架:底层原理与实战应用
  • 0元部署私有n8n,免费的2CPU+16GB服务器,解锁无限制的工作流体验
  • ruoyi vue element 实现点击、返回首页收起已经展开的菜单栏
  • SpringBoot 整合 Kafka 的实战指南
  • 《用 Django 构建博客应用:从模型设计到文章管理的全流程实战》
  • 2025年11月GIS应用技术测评考试(附考试资料分享)
  • 【开题答辩全过程】以 校园安全管理系统设计与实现为例,包含答辩的问题和答案
  • Django 命令大全:从入门到精通,开发者必备指南
  • Spring Boot 事务失效的八大原因及解决方案详解
  • 什么是科技成果鉴定测试?成果鉴定测试报告带给企业什么好处?
  • 【54页PPT】基于DeepSeek的数据治理技术(附下载方式)
  • 数据库高可用全方案:Keepalived 故障切换 + LVS (DR) 模式 + MariaDB 主主同步实战案例
  • 深度学习----卷积神经网络的数据增强
  • docker 安装 redis 并设置 volumes 并修改 修改密码(三)