探索HarmonyOS NEXT强大的图形渲染能力,从图片展示到自定义绘图

HarmonyOS NEXT作为华为自主研发的操作系统,为开发者提供了一套丰富而强大的图形渲染能力。无论是显示图片、绘制几何图形,还是实现复杂的自定义绘图,鸿蒙都提供了简洁而高效的解决方案。

本文将详细介绍鸿蒙NEXT中三种主要的图形处理方式:图片显示、几何图形绘制和画布自定义绘制。

1. 图片显示(Image组件)

Image组件是鸿蒙中用于显示图片的核心组件,它支持多种图片格式和源类型,让开发者能够灵活地在应用中展示图像内容。

基本用法和数据源类型

Image组件支持多种数据源,只需简单调用即可显示不同来源的图片:

typescript

// 本地资源
Image('images/panda.jpg').width(100)// Resource资源
Image($r('app.media.cat')).width(100)// 网络资源(需要申请权限)
Image('https://example.com/example.JPG').width(200)// 媒体库资源
Image('file://media/Photos/5').width(200)// Base64资源
Image('data:image/png;base64,...').width(100)// PixelMap像素图
@State image: PixelMap | undefined = undefined
Image(this.image).width(100).height(100)

网络图片权限申请

使用网络图片时,需要在module.json5文件中声明网络访问权限:

json

{"module": {"requestPermissions": [{"name": "ohos.permission.INTERNET"}]}
}

常用属性配置

Image组件提供了一系列属性用于控制图片显示效果:

typescript

Image($r('app.media.cat')).width(100).height(200).objectFit(ImageFit.Fill) // 设置缩放类型.fillColor(Color.Blue)    // 设置SVG图片的绘制颜色

objectFit属性支持多种枚举值,用于控制图片的缩放行为:

属性值说明
ImageFit.Contain保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内
ImageFit.Cover保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界
ImageFit.Auto自适应显示
ImageFit.Fill不保持宽高比进行放大缩小,使得图片充满显示边界
ImageFit.ScaleDown保持宽高比显示,图片缩小或者保持不变
ImageFit.None保持原有尺寸显示

2. 绘制几何图形(Shape组件)

鸿蒙系统提供了强大的几何图形绘制能力,可以通过Shape组件及其子组件创建各种矢量图形。

创建绘制组件

绘制组件可以由以下两种形式创建:

形式一:绘制组件使用Shape作为父组件,实现类似SVG的效果。

typescript

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

形式二:绘制组件单独使用,直接在页面上绘制指定图形。

typescript

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

鸿蒙提供了7种基本绘制类型:Circle(圆形)、Ellipse(椭圆形)、Line(直线)、Polyline(折线)、Polygon(多边形)、Path(路径)、Rect(矩形)。

形状视口viewport

Shape组件支持viewport属性,用于指定用户空间中的一个矩形,该矩形映射到为关联的SVG元素建立的视区边界。

typescript

Shape() {Rect().width(300).height(50)
}
.viewPort({x: 0,y: 0,width: 300,height: 100,
})

viewport属性包含四个可选参数:

  • x 和 y:表示视区的左上角坐标

  • width 和 height:表示视区尺寸

通过viewport可以实现图形的放大与缩小效果:

typescript

// 通过viewport对图形进行放大与缩小
Row({space:10}) {Column() {// 放大效果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)}Column() {// 缩小效果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)}
}

自定义样式

绘制组件支持多种属性来自定义样式:

typescript

// 设置填充颜色
Path().width(100).height(100).commands('M150 0 L300 300 L0 300 Z').fill("#E87361")// 设置边框颜色
Path().width(100).height(100).fillOpacity(0).commands('M150 0 L300 300 L0 300 Z').stroke(Color.Red)// 设置边框透明度
Path().width(100).height(100).fillOpacity(0).commands('M150 0 L300 300 L0 300 Z').stroke(Color.Red).strokeWidth(10).strokeOpacity(0.2)// 设置线条拐角样式
Polyline().width(100).height(100).fillOpacity(0).stroke(Color.Red).strokeWidth(8).points([[20, 0], [0, 100], [100, 90]]).strokeLineJoin(LineJoinStyle.Round) // 圆角连接// 设置斜接长度与边框宽度比值
Polyline().width(100).height(100).fillOpacity(0).stroke(Color.Red).strokeWidth(10).points([[20, 0], [20, 100], [100, 100]]).strokeLineJoin(LineJoinStyle.Miter) // 尖角连接.strokeMiterLimit(1/Math.sin(45))    // 设置比值

3. 使用画布绘制自定义图形(Canvas组件)

对于更复杂的绘图需求,鸿蒙提供了Canvas组件,允许开发者进行完全自定义的图形绘制。

初始化画布组件

Canvas组件使用前需要初始化,并通过onReady事件回调进行绘制操作:

typescript

// 配置CanvasRenderingContext2D对象参数
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)// 初始化画布组件
Canvas(this.context).width('100%').height('100%').backgroundColor('#F5DC62').onReady(() => {// 在onReady回调中进行绘制操作this.context.fillStyle = '#0097D4';this.context.fillRect(50, 50, 100, 100);})

画布绘制方式

Canvas组件提供了两种绘制方式:

方式一:直接调用CanvasRenderingContext2D对象的API进行绘制

typescript

Canvas(this.context).onReady(() =>{this.context.beginPath();this.context.moveTo(50, 50);this.context.lineTo(280, 160);this.context.stroke();})

方式二:先定义Path2D对象构造路径,再进行绘制

typescript

Canvas(this.context).onReady(() =>{let region = new Path2D();region.arc(100, 75, 50, 0, 6.28);this.context.stroke(region);})

离屏绘制

离屏绘制(offscreen rendering)允许将渲染结果绘制到与屏幕不直接相关的缓冲区中进行处理,适用于实现阴影、模糊、遮罩等特殊效果。

typescript

// 离屏绘制示例
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
// 创建离屏画布上下文
private offContext: OffscreenCanvasRenderingContext2D = new OffscreenCanvasRenderingContext2D(600, 600, this.settings)Canvas(this.context).width('100%').height('100%').backgroundColor('#F5DC62').onReady(() =>{// 在离屏画布上绘制this.offContext.strokeRect(50, 50, 200, 150);// 将离屏绘制的图像在普通画布上显示let image = this.offContext.transferToImageBitmap();this.context.transferFromImageBitmap(image);})

画布常用绘制方法

Canvas组件提供了丰富的API用于绘制各种图形和效果:

基础形状绘制

typescript

Canvas(this.context).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();})

文本绘制

typescript

Canvas(this.context).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);})

渐变效果

typescript

Canvas(this.context).onReady(() =>{// 创建径向渐变色let grad = this.context.createRadialGradient(200,200,50, 200,200,200)// 设置渐变断点值grad.addColorStop(0.0, '#E87361');grad.addColorStop(0.5, '#FFFFF0');grad.addColorStop(1.0, '#BDDB69');// 使用渐变色填充矩形this.context.fillStyle = grad;this.context.fillRect(0, 0, 400, 400);})

绘制图片和图像像素处理

Canvas组件还支持通过drawImage方法绘制图片,以及通过createImageData、getPixelMap、getImageData等方法进行图像像素信息处理。

实战示例:绘制一个简单的自定义图形

下面是一个综合运用Shape和Canvas组件绘制自定义图形的完整示例:

typescript

@Entry
@Component
struct CustomGraphicsExample {private settings: RenderingContextSettings = new RenderingContextSettings(true)private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)build() {Column({ space: 10 }) {// 使用Shape组件绘制几何图形Shape() {Circle({ width: 100, height: 100 }).fill('#E87361')Rect().width(200).height(50).fill('#0097D4')}.viewPort({ x: 0, y: 0, width: 300, height: 150 }).width(300).height(150).backgroundColor('#F5DC62')// 使用Canvas组件绘制自定义图形Canvas(this.context).width(300).height(300).backgroundColor('#FFFFFF').onReady(() => {// 绘制矩形this.context.fillStyle = '#0097D4';this.context.fillRect(50, 50, 100, 100);// 绘制圆形this.context.beginPath();this.context.arc(200, 200, 50, 0, 6.28);this.context.fillStyle = '#E87361';this.context.fill();// 绘制文本this.context.font = '20px sans-serif';this.context.fillStyle = '#000000';this.context.fillText("HarmonyOS NEXT", 60, 250);})}.width('100%').height('100%').padding(20)}
}

总结

HarmonyOS NEXT提供了丰富而强大的图形渲染能力,从简单的图片显示到复杂的自定义绘图,都能满足开发者的各种需求:

  1. Image组件简单易用,支持多种图片源和显示效果控制,适合大多数图片展示场景。

  2. Shape组件提供了声明式的矢量图形绘制方式,支持7种基本几何图形和丰富的样式配置,适合绘制简单的矢量图形。

  3. Canvas组件提供了底层的绘图API,支持完全自定义的图形绘制,适合复杂的绘图需求和动态图形效果。

无论是开发简单的图片展示功能,还是实现复杂的自定义图形绘制,鸿蒙NEXT都能提供合适的解决方案。希望通过本文的介绍,能帮助您更好地理解和运用鸿蒙的图形渲染能力,开发出更加美观和功能丰富的应用。

温馨提示:在实际开发中,请注意根据需求选择合适的图形渲染方式。对于简单的静态图形,优先考虑使用Shape组件;对于复杂的动态图形,再考虑使用Canvas组件。同时,使用网络图片时别忘了申请相应的权限。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python + Flask模块学习 2 接收用户请求并返回json数据

用到的模块还是flask,用到的类有Flask, request, jsonfiy 🙂 目录 1、GET请求 2、POST请求 1、表单格式 2、json格式 就酱,也比较简单,下一篇说简单的授权,简单来说就是比如用户付费买了服…

国内外常用的免费BUG管理工具选型

帮助用户根据自身情况做决定,比如团队规模、技术能力、是否需要移动端支持等。避免只是罗列工具,而是提供实际选择的维度。 国内外常用的免费BUG管理工具选择非常丰富,从轻量级到功能全面型都有覆盖。我将它们分为几类,并详细介绍…

JavaScript的事件循环机制

1.事件循环的理解JavaScript是单线程的,意味着它一次只能执行一个任务。而事件循环就是去协调在JavaScript环境中运行的同步任务、异步任务(微任务、宏任务)的执行顺序的一种机制。它是 JavaScript 实现单线程非阻塞异步执行的核心。2.事件循环的执行顺序同步任务—…

数据结构——栈(Java)

目录 一定义. 入栈 出栈 二.栈与线性表的关系 三.栈的实现方式 四.链表实现栈 1.结点的API设计 2.栈的API设计 2.1栈的初始化设计 2.2元素入栈 2.3元素出栈 五.括号匹配问题 完整代码展示 答案 一定义. 栈是一种基于先进后出(FILO)的数据…

科研笔记:数学建模启发的课题研究方法

借鉴数学建模的思路解决科学问题或开展课题研究,核心是将实际问题抽象为数学框架,通过定量分析、逻辑推演和验证优化,实现对问题的精准描述、解释或预测。其本质是“从现实到数学,再从数学回归现实”的迭代过程,适用于…

Agent落地到底选择LangChain 还是 LangGraph

核心概念 LangChain:一个用于构建由大型语言模型驱动的应用程序的框架。它提供了大量的组件和现成的链,旨在简化和标准化应用程序与LLM交互的过程。 LangGraph:一个用于在LangChain之上构建有状态、多参与者的 工作流 的库。它特别擅长处理具有循环、分支和复杂协调的代理(…

ChatGPT下的相关聊天提示词

问:如果我觉得一个子对话里,聊天聊得太多,在这个项目下新开一个子对话,但是不想把上次太多的信息 都复制过来,有没有什么办法关键词:项目、子对话,上下文ChatGPT:有办法的 ✅在 ChatGPT 里&…

最新PDF版本!Acrobat Pro DC 2025,解压即用版

软件介绍 Adobe Acrobat Pro DC 2025 是全球知名的 PDF 编辑神器,被称为 “最牛 PDF 工具”,能轻松解决 PDF 编辑、创建、转换等难题,本次分享的版本解压即可使用。 软件特点 然解压即可使用不用登录注册最新版本 软件使用 我们打开软件选…

XX汽集团数字化转型:全生命周期网络安全、数据合规与AI工业物联网融合实践

引言:数字化转型中的安全与效率双轮驱动作为中国汽车行业的龙头企业,XX汽集团近年来积极推进数字化转型,通过构建全生命周期网络安全体系、完善数据合规治理框架,并深度融合AI工业物联网技术,实现了生产成本显著降低和…

云原生部署_Docker入门

Docker是啥Docker是一个开源的容器化平台,可以帮助开发者将应用程序和其依赖的环境打包成一个可移植、可部署的容器。Docker的主要目标是通过容器化技术,实现应用程序的快速部署、可移植性和可扩展性,从而简化应用程序的开发、测试和部署过程…

【大数据专栏】大数据框架-Apache Druid Overview

目录 Architecture Advantages and disadvantages 从架构以及设计可以得出结论,Durid不支持ACID事务,基于时间戳列和维度列去查询,所以适合基于时间做分组和学列的查询操作。 Advantages优势: 实时数据摄取与查询 支持秒级数据摄…

云平台面试内容(一)

1. 云计算的优点、服务模型区别及云部署模式 云计算优点: 云计算具有显著的优势,包括无需自建机房和硬件投入,资源即开即用并支持弹性伸缩,按需付费使成本透明可控。企业可以在数分钟内完成全球范围的部署,缩短上线周期。同时云平台提供高可用性和安全性,多副本容灾保证数…

嵌入式 - 硬件:51单片机(2)

本节重点:1. GPIO输入模式、输出模式2. 按键工作原理(GPIO输入)3. 中断概念4. 中断源概念、中断源个数、哪几个中断源5. 外部中断、定时器中断概念6. 中断处理流程:7. 51单片机中定时器的个数?类型8. 16位定时器和8位…

C语言中奇技淫巧07-使用GCC栈保护选项检测程序栈溢出

-fstack-protector 是 GCC 和 Clang 编译器提供的一种栈保护(Stack Smashing Protection, SSP) 机制,用于检测和防御常见的缓冲区溢出攻击(特别是栈溢出)。它通过在函数的栈帧中插入特殊的“金丝雀值”(can…

.NET 8.0 Web API JWT 身份验证和基于角色的授权

在当今的数字环境中,保护 Web 应用程序的安全至关重要。随着 .NET 8.0 的不断发展,它提供了强大的工具来确保您的 API 既安全又高效。 示例代码:https://download.csdn.net/download/hefeng_aspnet/91490262 如果您喜欢此文章&#xff0c…

ZYNQ SDK软件在线调试

1、然后右键项目->debug as->launch on hardware2、从左到右分别是:运行程序到设置的断点暂停运行终止断开连接步进(进入函数内部)跳过(不进入函数内部)跳出函数3、双击添加断点,然后点击运行可以让程…

四大金刚之计算机操作系统

1. 进程和线程的区别?创建线程的代价比创建进程小吗?进程是资源分配和调度的基本单位;线程是 CPU 调度的基本单位。进程有独立的地址空间,线程共享进程地址空间。创建/销毁进程开销大,线程开销小。是的,因为…

redis--redis.conf的相关配置问题

关于redis.conf内的相关重要的配置介绍 1. bind 配置 仅仅设置bind,还需要搭配下面的rotected-mode 配置才能外部ip进行连接 功能:设置 Redis 监听的 IP 地址,决定哪些设备可以连接到 Redis 服务器。 bind 127.0.0.1:只允许本机&a…

unsloth 笔记:从最近的检查点继续微调

检查点(checkpointing)可以把微调进度保存下来,这样可以中途暂停,随后继续训练。首先需要在 Trainer 的参数里添加 save_strategy 和 save_steps。trainer SFTTrainer(....args TrainingArguments(....output_dir "output…

DevOps平台选型指南:破解研发效率瓶颈,适配金融/政务/国产化场景的5大关键指标

在数字化转型的浪潮中,软件研发效能已成为企业的核心竞争力。然而,许多团队在追求敏捷与高速交付的过程中,常常会遇到工具链割裂、流程冗长、环境混乱等效率瓶颈。选择一个合适的、一体化的DevOps平台,是破解这些瓶颈、实现研发运…