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

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

3天内不再提示

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

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

扫码添加小助手

加入工程师交流群

theme: hydrogen

大家好,欢迎来到莓创IT技术分享频道,我是陈杨。由于经常有小伙伴一直给我反馈说莓创图表(mccharts)数据多的时候经常卡顿,很无奈之前做动画的时候没考虑ArkTs的性能瓶颈,导致现在又要重构开发。于是我重新翻阅文档,看看有没有新的方式来解决。在翻阅官网文档的时候,无意间看到这句话。

发现了@ohos.graphics.drawing模块性能竟然比canvas好,所以最近我有时间都在学习这个API的功能,准备将莓创图表(mccharts)进行性能升级,打造更加完美的图表组件库。这次我也给大家好好分享一下这个API,给大家准备了三篇,写的不好请见谅。

一、导入模块(@ohos.graphics.drawing)

要使用这个绘图模块,第一步得把它导入到咱们的代码里。在代码里加上这行:

import { drawing } from '@kit.ArkGraphics2D';

这样,咱们就可以使用模块里的各种功能啦。

二、绘制基本图形

(一)绘制矩形

鸿蒙绘图里,绘制矩形有两种常用方法,都在Canvas类里。
第一种方法是drawRect(rect: common2D.Rect): void。这里的rect参数是一个common2D.Rect类型的对象,它就像是矩形的“定位器”和“尺码表”,通过设置left(左边的位置)、right(右边的位置)、top(上边的位置)和bottom(下边的位置),能精确确定矩形在画布上的位置和大小。来看个例子:

import { common2D, drawing } from '@kit.ArkGraphics2D';
class DrawingRenderNode {
    draw(context) {
        const canvas = context.canvas;
        const rect = { left: 50, right: 150, top: 50, bottom: 150 };
        canvas.drawRect(rect);
    }
}

从API version 12开始,又多了一个更方便的方法drawRect(left: number, top: number, right: number, bottom: number): void。这个方法直接传入矩形四个角的坐标就行,代码写起来更简洁,而且性能还更好呢!比如:

canvas.drawRect(50, 50, 150, 150);

(二)绘制圆形

绘制圆形就用drawCircle(x: number, y: number, radius: number): void这个方法。xy代表圆心在画布上的坐标,就像给圆心定个“家”,radius就是圆的半径啦,而且半径得是大于0的正数,不然就画不出圆咯。举个例子:

canvas.drawCircle(100, 100, 30);

这行代码就是在坐标(100, 100)的地方画一个半径为30的圆。想象一下,就像在画布上找到了一个中心点,然后以这个点为中心,用半径为30的“画笔”转一圈,一个圆就画好啦。

三、设置颜色和混合模式

(一)绘制颜色

给图形上色可以用drawColor方法,它有两种形式。
第一种drawColor(color: common2D.Color, blendMode?: BlendMode): void,这里的colorARGB格式的颜色,ARGB分别代表透明度(Alpha)、红色(Red)、绿色(Green)、蓝色(Blue)。blendMode是颜色混合模式,默认是SRC_OVER。比如咱们想画个红色的图形,代码可以这样写:

import { common2D, drawing } from '@kit.ArkGraphics2D';
canvas.drawColor({ alpha: 255, red: 255, green: 0, blue: 0 }, drawing.BlendMode.SRC_OVER);

从API version 12开始,又有了一个更简单直接的方法drawColor(alpha: number, red: number, green: number, blue: number, blendMode?: BlendMode): void。直接把颜色通道的值传进去就行,用起来更方便,性能也更好。像这样:

canvas.drawColor(255, 255, 0, 0, drawing.BlendMode.SRC_OVER);

(二)颜色混合模式

颜色混合模式就像是给图形颜色玩“魔法组合”,BlendMode枚举里有好多有趣的模式可以选择。比如说CLEAR模式,用了它,绘制区域就会变得全透明,就好像图形隐身了一样。看代码:

canvas.drawColor({ alpha: 255, red: 255, green: 0, blue: 0 }, drawing.BlendMode.CLEAR);

而默认的SRC_OVER模式,是在目标像素的上面绘制源像素,而且还会考虑源像素的透明度,这样颜色叠加起来就会有不一样的效果,让图形看起来更有层次感。

四、案例:绘制一个多彩的界面

咱们来综合运用这些知识,画一个简单的多彩界面,不过显示比较麻烦。假设要画一个蓝色的矩形,再在上面画一个红色的圆形,代码可以这么写:

import { UIContext, NodeController, FrameNode, RenderNode, DrawContext } from '@kit.ArkUI';
import { common2D, drawing } from '@kit.ArkGraphics2D';

// 1. 自定义RenderNode
export class MyRenderNode extends RenderNode {
  async draw(context: DrawContext) {
    const canvas = context.canvas;
        // 绘制蓝色矩形
        const blueRect = { left: 30, right: 130, top: 30, bottom: 130 };
        canvas.drawColor({ alpha: 255, red: 0, green: 0, blue: 255 }, drawing.BlendMode.SRC);
        canvas.drawRect(blueRect);
        // 绘制红色圆形
        canvas.drawColor({ alpha: 255, red: 255, green: 0, blue: 0 }, drawing.BlendMode.SRC);
        canvas.drawCircle(80, 80, 30);
  }
}

// 2. 自定义NodeController
export class MyNodeController extends NodeController {
  private rootNode: FrameNode | null = null;
  myRenderNode = new MyRenderNode();

  makeNode(uiContext: UIContext): FrameNode {
    this.rootNode = new FrameNode(uiContext);
    if (this.rootNode === null) {
      return this.rootNode
    }

    const renderNode = this.rootNode.getRenderNode();
    if (renderNode !== null) {
      this.myRenderNode.backgroundColor = 0xffffffff;
      this.myRenderNode.frame = { x: 0, y: 0, width: 4800, height: 4800 };
      this.myRenderNode.pivot = { x: 0.2, y: 0.8 }
      this.myRenderNode.scale = { x: 1, y: 1 }
      renderNode.appendChild(this.myRenderNode);
      renderNode.clipToFrame = true
    }
    return this.rootNode;
  }
}

@Entry
@Component
struct RenderTest {
  @State message: string = 'hello'
  build() {
    Row() {
      Column() {
        // 4. 将自定义NodeController进行显示
        NodeContainer(new MyNodeController())
          .width('100%')
      }
      .width('100%')
      .height('80%')
    }
    .height('100%')
  }
}

在这段代码里,先设置颜色为蓝色,用SRC混合模式填充矩形区域,再绘制蓝色矩形。接着设置颜色为红色,同样用SRC混合模式,然后绘制红色圆形。运行这段代码,就能看到一个蓝色矩形上面有个红色圆形的界面啦。

今天咱们学习了鸿蒙绘图@ohos.graphics.drawing模块的基础用法,包括导入模块、绘制基本图形、设置颜色和混合模式,还做了一个小案例。掌握了这些基础,后面咱们就能继续探索进阶和高阶的绘图技巧,画出更厉害的图形啦!赶紧动手试试吧,要是遇到问题,多调试调试代码,或者去官方文档里找找答案。加油,期待大家画出超酷的图形!

也可以加入我们鸿蒙技术交流群,开发鸿蒙原生应用过程有啥问题都可以在群沟通,互相帮助,一起进步。

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

审核编辑 黄宇

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

    关注

    2

    文章

    2192

    浏览量

    66321
  • 鸿蒙
    +关注

    关注

    60

    文章

    2869

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    首先,不止米哈与鸿蒙合作原生应用开发。在这之前还有其他互联网大厂已经与鸿蒙开发合作。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

    实锤!腾讯终于拥抱鸿蒙生态,微信鸿蒙原生版本即将上线

    大家都知道, 目前已知纯血鸿蒙星河版next将于今年6月份开启Bate版本的测试 ,也就是说原生鸿蒙系统快上线了。 而目前对于鸿蒙生态的发展,大家最关心的恐怕只有腾讯系的微信和QQ是否
    发表于 04-30 21:14

    鸿蒙原生开发手记: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

    绘图API函数

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

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

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

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

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

    哪吒汽车APP启动鸿蒙原生应用开发

    哪吒汽车正式签约,启动鸿蒙原生应用开发;在5月17日,在上海市经济和信息化委员会指导的“千帆竞发启航 共筑鸿蒙生态——HDD上海站·鸿蒙原生
    的头像 发表于 05-18 09:48 1724次阅读

    华为所有新手机将搭载鸿蒙 余承东:2025年起华为新品将全部搭载原生鸿蒙系统

    鸿蒙两个选择,但是2015年华为新品将全部搭载原生鸿蒙。 Mate70 / Pro / Pro+ 及 Mate X6 系列旗舰手机支持到手即可升级
    的头像 发表于 11-27 15:42 8113次阅读

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

    theme: hydrogen 家人们,还记得上次一起探索的鸿蒙绘图API基础用法吗?上手是不是特别容易!今天,咱们就接着深入,开启进阶版的学习,解锁更多复杂又炫酷的绘图技能,让你的
    的头像 发表于 03-16 15:57 937次阅读