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

陈杨
• 阅读 25

theme: hydrogen

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

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

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

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

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

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

点赞
收藏
评论区
推荐文章
陈杨 陈杨
4天前
开源啦!!!基于鸿蒙ArkTS封装的图表组件《McCharts》,大家快来一起共创
Hello;大家好,我是陈杨。好久没更新了,首先是自己本职工作比较忙,基本没时间写作。其次就是学习技术,自学鸿蒙ArkTS语言已经接近半年了,也算半路出师了,这次将分享我封装的组件库,所以有啥讲错的地方请大家高抬贵手,宽容一下,谢谢。这次主要是给大家带来一
陈杨 陈杨
4天前
【McCharts】基于鸿蒙ArkTS语法开发的图表组件--折线图
简介大家好,我是陈杨。今天主要是分享一下McCharts组件库中的折线图实现过程,记录并分享自己的一些开发经验,感兴趣的可以互相学习。McCharts组件库是基于鸿蒙ArkTS语法开发,支持API9以上的版本。图表组件已经开源了,大家可以一起参与进来,不管
陈杨 陈杨
4天前
McCharts 2.0来了,完美适配HarmonyOS NEXT最新版本,可轻松迁移Echarts图表项目
大家好,我是陈杨。终于有时间来分享一些技术文章了,自从McCharts组件上线第一期之后,就开始忙碌鸿蒙创新赛与极客马拉松比赛。在比赛的过程一直收到很多Issues,但是由于腾不出时间来维护,导致大家以为我们不维护了。在这里给大家说一声对不起。现在两个比赛
陈杨 陈杨
3天前
McCharts 2.0来了,完美适配HarmonyOS NEXT最新版本,可轻松迁移Echarts图表项目
大家好,我是陈杨。终于有时间来分享一些技术文章了,自从McCharts组件上线第一期之后,就开始忙碌鸿蒙创新赛与极客马拉松比赛。在比赛的过程一直收到很多Issues,但是由于腾不出时间来维护,导致大家以为我们不维护了。在这里给大家说一声对不起。现在两个比赛
陈杨 陈杨
4天前
分享之前使用HarmonyOS NEXT Canvas做的动态GIF视频的一个案例,没有感情,全是技术。
theme:fancyhello,大家好,我是莓创陈杨。最近忙着改图表组件的BUG,还有定制化开发一些图表。没啥时间写新东西,草稿里面放了十几个要实现的案例分享,欠的实在太多了,后面再慢慢还吧。这次分享一下之前使用HarmonyOSNEXTCanvas做的
陈杨 陈杨
4天前
跟大家一起来总结我半年内参加三次鸿蒙比赛,失利了两次的经验,这体验真刺激!!!
Hello,大家好,我是陈杨。自从参加完华为HDC大会之后,我就一直在犹豫要不要继续开发华为鸿蒙应用吗?导致这个原因就是我参加两个鸿蒙比赛,分别是:HarmonyOSNEXT创新赛与极客马拉松,可想而知两次都失败了。对于这两次失败我一直在反思,到底我有没有
陈杨 陈杨
4天前
【莓创Chart】基于鸿蒙原生ArkTS语法开发的图表组件--柱状图
大家好,我是陈杨。在上一篇文章中,我简要介绍了折线图的实现逻辑,并解释了整体图表的绘制规则。根据这些规则,我们还可以绘制更多种类的图表组件。在本期中,我将讲解如何实现柱状图,并引入了一个新的功能。鉴于柱状图跟折线图可共用的基础配置很多,我将不再重复介绍基础
陈杨 陈杨
4天前
实战分享!!HarmonyOS NEXT开发一款智能会议小助手应用
大家好,我是陈杨;一只会打代码的羊。最近在忙着全面升级我们的莓创图表组件,一直没有更新与分享相关的技术;等全面升级完成之后会给大家介绍一下做了什么升级,敬请期待!!这次抽点时间出来给大家分享一下之前使用HarmonyOSNEXT开发了一款智能小助手APP整
陈杨 陈杨
4天前
在原生鸿蒙上开发一款绘画动画软件,然后制作动画短视频,发到B站会火?
大家好,欢迎来到莓创IT技术频道;我是陈杨。今天给大家介绍一款我开发的动画制作软件:IF画。这款软件一开始是准备自己用来学习绘画跟学习制作动画视频的,如果学会成功了,自己就画画插画或者动画,然后投稿到各大短视频平台,做一位自媒体达人,就不再打代码了。但是当
陈杨 陈杨
4天前
鸿蒙原生绘图API:从基础到高阶的绘制之旅(进阶版)
家人们,还记得上次一起探索的鸿蒙绘图API基础用法吗?上手是不是特别容易!今天,咱们就接着深入,开启进阶版的学习,解锁更多复杂又炫酷的绘图技能,让你的鸿蒙应用界面直接“出圈”!我将结合实际开发场景,丰富绘制路径、圆角矩形、绘制图片、画笔与画刷、裁剪区域设置