0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙原生绘图API:从基础到高阶的绘制之旅(进阶版)

陈姚丰 来源:jf_83680738 作者:jf_83680738 2025-03-16 15:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

theme: hydrogen

家人们,还记得上次一起探索的鸿蒙绘图API基础用法吗?上手是不是特别容易!今天,咱们就接着深入,开启进阶版的学习,解锁更多复杂又炫酷的绘图技能,让你的鸿蒙应用界面直接“出圈”!

我将结合实际开发场景,丰富绘制路径、圆角矩形、绘制图片、画笔与画刷、裁剪区域设置这几个方面的案例,让示例更具实操性和参考价值。

一、复杂图形绘制

(一)路径绘制

当绘制不规则图形,比如独特的图标、创意的装饰元素时,Path类就成了得力助手,它能帮我们创建并操控各种复杂路径。这些路径可以由直线、弧线、贝塞尔曲线等组合而成。

创建路径对象很简单:

let path = new drawing.Path();

接着设置路径起始点:

path.moveTo(10, 10);

然后添加线段:

path.lineTo(100, 100);

绘制弧线也不难:

path.arcTo(100, 100, 200, 200, 0, 90);

除了弧线,还能使用二阶贝塞尔曲线(quadTo)和三阶贝塞尔曲线(cubicTo) 。

案例:绘制一个五角星
五角星的绘制需要结合直线和贝塞尔曲线,利用Path类的相关方法,通过精确计算每个顶点的坐标来实现。

let path = new drawing.Path();
// 五角星的半径
const radius = 100;
// 计算五角星顶点坐标的辅助函数
function calculateVertex(angle) {
    return {
        x: Math.sin(angle) * radius + 200,
        y: -Math.cos(angle) * radius + 200
    };
}
// 五角星的内角角度
const angles = [
    0,
    Math.PI * 2 / 5,
    Math.PI * 4 / 5,
    Math.PI * 6 / 5,
    Math.PI * 8 / 5
];
// 移动到第一个顶点
path.moveTo(calculateVertex(angles[0]).x, calculateVertex(angles[0]).y);
for (let i = 1; i < 5; i++) {
    const vertex = calculateVertex(angles[i]);
    path.lineTo(vertex.x, vertex.y);
}
// 闭合路径
path.close();
// 附加画笔并绘制路径
let pen = new drawing.Pen();
pen.setStrokeWidth(4);
pen.setColor({ alpha: 255, red: 255, green: 0, blue: 0 });
canvas.attachPen(pen);
canvas.drawPath(path);
canvas.detachPen();

在这个案例中,通过数学计算得到五角星每个顶点的坐标,利用moveTolineTo方法依次连接各个顶点,最后使用close方法闭合路径,实现五角星的绘制。

(二)圆角矩形绘制

在追求界面美观与柔和的设计中,圆角矩形很常用。使用drawRoundRect方法可以实现:

drawRoundRect(roundRect: RoundRect): void

其中,RoundRect对象包含了矩形的位置、大小以及圆角半径信息。

案例:绘制一个卡片式布局
在很多应用中,卡片式布局很常见,使用圆角矩形可以轻松实现。

import { common2D, drawing } from '@kit.ArkGraphics2D';
// 卡片的位置和大小
let rect = { left: 50, top: 50, right: 250, bottom: 150 };
// 圆角半径
let roundRect = new drawing.RoundRect(rect, 15, 15);
// 附加画刷设置背景颜色
let brush = new drawing.Brush();
brush.setColor({ alpha: 255, red: 240, green: 240, blue: 240 });
canvas.attachBrush(brush);
canvas.drawRoundRect(roundRect);
canvas.detachBrush();
// 附加画笔绘制边框
let pen = new drawing.Pen();
pen.setStrokeWidth(2);
pen.setColor({ alpha: 255, red: 128, green: 128, blue: 128 });
canvas.attachPen(pen);
canvas.drawRoundRect(roundRect);
canvas.detachPen();

在这个案例中,先定义了卡片的位置、大小和圆角半径,创建RoundRect对象。然后分别使用画刷设置背景颜色,使用画笔绘制边框,实现了一个简单的卡片式布局。

二、图像绘制

(一)绘制图片

在应用开发中,在画布上绘制图片很常见。drawImage系列方法可以满足需求:

drawImage(pixelmap: image.PixelMap, left: number, top: number, samplingOptions?: SamplingOptions): void

pixelmap是要绘制的图片对象,lefttop指定图片在画布上的位置,samplingOptions用于设置采样选项(API version 12+支持)。

从API version 12开始,新增了更灵活的方法。drawImageRect可以将图片绘制到指定区域:

drawImageRect(pixelmap: image.PixelMap, dstRect: common2D.Rect, samplingOptions?: SamplingOptions): void

drawImageRectWithSrc则能将图片的指定区域绘制到画布的指定区域:

drawImageRectWithSrc(pixelmap: image.PixelMap, srcRect: common2D.Rect, dstRect: common2D.Rect, samplingOptions?: SamplingOptions, constraint?: SrcRectConstraint): void

案例:制作一个图片画廊
假设我们要制作一个简单的图片画廊,展示三张图片,并且对其中一张图片进行局部放大展示。

import { image, drawing, common2D } from '@kit.ArkUI';
// 加载三张图片
Promise.all([
    image.createPixelMap(/* 图片1数据 */),
    image.createPixelMap(/* 图片2数据 */),
    image.createPixelMap(/* 图片3数据 */)
]).then(([pixelMap1, pixelMap2, pixelMap3]) = > {
    // 绘制第一张图片
    canvas.drawImage(pixelMap1, 20, 20);
    // 绘制第二张图片
    canvas.drawImage(pixelMap2, 150, 20);
    // 绘制第三张图片,并对其局部放大展示
    const srcRect = { left: 50, top: 50, right: 150, bottom: 150 };
    const dstRect = { left: 280, top: 20, right: 400, bottom: 140 };
    canvas.drawImageRectWithSrc(pixelMap3, srcRect, dstRect);
});

在这个案例中,使用Promise.all同时加载三张图片,然后分别使用drawImagedrawImageRectWithSrc方法将图片绘制到画布上,实现了一个简单的图片画廊效果,并且对第三张图片进行了局部放大展示。

三、绘制状态与属性设置

(一)画笔与画刷

在绘制图形时,Pen类和Brush类能帮我们设置线条和填充属性,让图形更具个性。

Pen类可以设置线条颜色、宽度、是否抗锯齿等。

let pen = new drawing.Pen();
pen.setStrokeWidth(5);
pen.setColor({ alpha: 255, red: 255, green: 0, blue: 0 });
pen.setAntiAlias(true);
canvas.attachPen(pen);
// 绘制图形
canvas.drawRect(10, 10, 110, 110);
canvas.detachPen();

Brush类用于设置填充属性,比如填充颜色。

let brush = new drawing.Brush();
brush.setColor({ alpha: 255, red: 0, green: 255, blue: 0 });
canvas.attachBrush(brush);
// 绘制图形
canvas.drawCircle(100, 100, 50);
canvas.detachBrush();

案例:绘制一个立体按钮
通过画笔和画刷的配合,可以绘制出具有立体感的按钮。

// 绘制按钮背景
let brush = new drawing.Brush();
brush.setColor({ alpha: 255, red: 100, green: 100, blue: 255 });
canvas.attachBrush(brush);
let rect = { left: 100, top: 100, right: 200, bottom: 150 };
canvas.drawRoundRect(new drawing.RoundRect(rect, 10, 10));
canvas.detachBrush();
// 绘制按钮边框,模拟立体效果
let pen = new drawing.Pen();
pen.setStrokeWidth(2);
// 上边框和左边框颜色较浅
pen.setColor({ alpha: 255, red: 200, green: 200, blue: 255 });
canvas.attachPen(pen);
canvas.drawLine(100, 100, 200, 100);
canvas.drawLine(100, 100, 100, 150);
canvas.detachPen();
// 下边框和右边框颜色较深
pen.setColor({ alpha: 255, red: 50, green: 50, blue: 150 });
canvas.attachPen(pen);
canvas.drawLine(100, 150, 200, 150);
canvas.drawLine(200, 100, 200, 150);
canvas.detachPen();

在这个案例中,先使用画刷绘制按钮的背景,然后通过画笔分别设置不同颜色绘制边框,模拟出立体效果。

(二)裁剪区域设置

有时候,我们只想在画布的特定区域进行绘制,clipRect方法可以实现:

canvas.clipRect({ left: 50, top: 50, right: 150, bottom: 150 }, drawing.ClipOp.DIFFERENCE, true);

第一个参数指定裁剪区域的矩形,第二个参数是裁剪操作类型,ClipOp.DIFFERENCE表示取差集,即只保留画布上不在裁剪区域内的部分;第三个参数表示是否反转裁剪区域。

案例:制作一个图片蒙版效果
通过设置裁剪区域,可以制作图片蒙版效果。

import { image, drawing, common2D } from '@kit.ArkUI';
image.createPixelMap(/* 图片数据 */).then((pixelMap) = > {
    // 设置裁剪区域为圆形
    const circleRect = { left: 100, top: 100, right: 200, bottom: 200 };
    const circlePath = new drawing.Path();
    circlePath.addCircle(150, 150, 50);
    canvas.clipPath(circlePath, drawing.ClipOp.INTERSECT);
    // 绘制图片
    canvas.drawImage(pixelMap, 0, 0);
    // 清除裁剪区域
    canvas.restore();
});

在这个案例中,先创建一个圆形路径,使用clipPath方法设置裁剪区域为圆形,然后绘制图片,这样图片就只会显示在圆形区域内,实现了图片蒙版效果。最后使用restore方法清除裁剪区域,以便后续正常绘制。

家人们,到这里,鸿蒙绘图API的进阶内容就学完啦!是不是感觉自己离大神又近了一步?赶紧动手实践,把这些知识运用到实际开发中。要是遇到问题,别担心,去官方文档里找找答案,或者和技术交流群里的小伙伴们一起讨论。下一次,咱们将挑战高阶版,一起探索更高级的绘图技巧,期待与大家共同进步!

在开发鸿蒙原生应用的时候,需要用到图表组件的也可以尝试使用我们封装的。图表的官网地址:[meichuangit.net.cn/]

如果你对案例还有其他修改意见,比如增减特定场景案例、调整代码注释等,欢迎随时提出。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    2158

    浏览量

    66246
  • 鸿蒙
    +关注

    关注

    60

    文章

    2859

    浏览量

    45363
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    米哈游启动鸿蒙原生应用开发,给程序员带来了什么信息?

    首先,不止米哈与鸿蒙合作原生应用开发。在这之前还有其他互联网大厂已经与鸿蒙开发合作。HarmonyOS NEXT系统也在积极筹备中,已有400多家合作伙伴加入,全面启动了鸿蒙
    发表于 01-07 22:25

    鸿蒙Harmony是如何影响Android工程师的呢?

    官宣开始进行鸿蒙原生应用的研发之旅。迄今为止,已有超过 400 家合作伙伴投身其中,共同投入鸿蒙原生
    发表于 01-14 22:14

    HarmonyOS SDK,助力开发者打造焕然一新的鸿蒙原生应用

    鸿蒙生态千帆启航仪式于 1 月 18 日正式启动。 2019 年 HarmonyOS 正式发布 2020 年“没有人能够熄灭漫天星光”,今天,满天星光终汇成璀璨星河,HarmonyOS NEXT
    发表于 01-19 10:31

    鸿蒙原生开发手记:01-元服务开发

    简介 元服务是鸿蒙中的一种轻量应用形态,无需下载,直接运行。类似于微信小程序,但与小程序不同的是,元服务更加轻量。 元服务使用原生开发,是系统级提供的,无论易用性、性能、体验上,都要比小程序好
    发表于 11-14 17:28

    鸿蒙原生页面高性能解决方案上线OpenHarmony社区 助力打造高性能原生应用

    NEXT的原生页面高性能解决方案,页面滑动、跳转及应用冷启动等关键环节,为开发者提供全面的支持。目前,这些解决方案均已上线OpenHarmony开源社区,可在OpenHarmony三方库中心仓进行搜索,欢迎开发者多多使用和共建,打造更极致性能的
    发表于 01-02 18:00

    鸿蒙原生应用开发也可以使用DeepSeek了

    和无私奉献的辛勤工作,才让我们能够轻松地将强大的DeepSeek模型集成鸿蒙原生应用的开发环境中,为开发效率的提升提供了强大的技术支持,向他们的这种精神和奉献致敬! 下载链接:http
    发表于 02-20 18:06

    Kuikly鸿蒙版正式开源 —— 揭秘卓越性能适配之旅

    为Kotlin Native增加鸿蒙平台的互操作文件,对接系统API,同时调整运行时中涉及架构、平台的判断等逻辑,使其实现对鸿蒙平台的支持。 完成初步适配后,通过Kotlin官方的
    发表于 06-04 16:46

    鸿蒙开发API9 API12,有哪些不同

    API9属于“兼容安卓”时代的产物,和API10开始的纯血鸿蒙还是具有一定区别的,当然,虽然我们说纯血鸿蒙
    发表于 06-29 22:47

    嵌入式入门进阶,怎么学?

    嵌入式入门进阶,怎么学? 嵌入式学习的核心是 “软硬结合的技术壁垒”,科学分层才能高效突破。以下是入门
    发表于 09-02 09:44

    绘图API函数

    绘图API函数 一、 实验目的学习使用嵌入式系统的绘图API 函数。理解绘图设备上下文(DC)在多任务操作系统中的作用。会使用绘
    发表于 12-25 23:56 2168次阅读
    <b class='flag-5'>绘图</b>的<b class='flag-5'>API</b>函数

    《MATLAB进阶》程序与数据资料下载

    《MATLAB进阶》程序与数据
    发表于 01-13 10:09 18次下载

    【C语言进阶】C语言指针的高阶用法

    【C语言进阶】C语言指针的高阶用法
    的头像 发表于 08-31 13:24 3182次阅读

    串口屏LUA教程7-绘图API使用说明

    串口屏LUA教程7-绘图API使用说明
    发表于 04-29 13:12 13次下载

    使用 Taro 开发鸿蒙原生应用 —— 快速上手,鸿蒙应用开发指南

    随着鸿蒙系统的不断完善,许多应用厂商都希望将自己的应用移植鸿蒙平台上。最近,Taro 发布了 v4.0.0-beta.x 版本,支持使用 Taro 快速开发鸿蒙
    的头像 发表于 02-02 16:09 1842次阅读
    使用 Taro 开发<b class='flag-5'>鸿蒙</b><b class='flag-5'>原生</b>应用 —— 快速上手,<b class='flag-5'>鸿蒙</b>应用开发指南

    鸿蒙原生绘图API基础高阶绘制之旅(基础版)

    ArkTs的性能瓶颈,导致现在又要重构开发。于是我重新翻阅文档,看看有没有新的方式来解决。在翻阅官网文档的时候,无意间看到这句话。 发现了 @ohos.graphics.drawing 模块性能竟然比canvas好,所以最近我有时间都在学习这个API的功能,准备将莓创图表(mccharts)进行性能升级,打造
    的头像 发表于 03-16 15:58 785次阅读