theme: hydrogen
大家好,歡迎來到莓創(chuàng)IT技術分享頻道,我是陳楊。由于經(jīng)常有小伙伴一直給我反饋說莓創(chuàng)圖表(mccharts)
數(shù)據(jù)多的時候經(jīng)??D,很無奈之前做動畫的時候沒考慮ArkTs的性能瓶頸,導致現(xiàn)在又要重構開發(fā)。于是我重新翻閱文檔,看看有沒有新的方式來解決。在翻閱官網(wǎng)文檔的時候,無意間看到這句話。
發(fā)現(xiàn)了@ohos.graphics.drawing
模塊性能竟然比canvas好,所以最近我有時間都在學習這個API的功能,準備將莓創(chuàng)圖表(mccharts)進行性能升級,打造更加完美的圖表組件庫。這次我也給大家好好分享一下這個API,給大家準備了三篇,寫的不好請見諒。
一、導入模塊(@ohos.graphics.drawing)
要使用這個繪圖模塊,第一步得把它導入到咱們的代碼里。在代碼里加上這行:
import { drawing } from '@kit.ArkGraphics2D';
這樣,咱們就可以使用模塊里的各種功能啦。
二、繪制基本圖形
(一)繪制矩形
在鴻蒙繪圖里,繪制矩形有兩種常用方法,都在Canvas
類里。
第一種方法是drawRect(rect: common2D.Rect): void
。這里的rect
參數(shù)是一個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
這個方法。x
和y
代表圓心在畫布上的坐標,就像給圓心定個“家”,radius
就是圓的半徑啦,而且半徑得是大于0的正數(shù),不然就畫不出圓咯。舉個例子:
canvas.drawCircle(100, 100, 30);
這行代碼就是在坐標(100, 100)
的地方畫一個半徑為30
的圓。想象一下,就像在畫布上找到了一個中心點,然后以這個點為中心,用半徑為30
的“畫筆”轉(zhuǎn)一圈,一個圓就畫好啦。
三、設置顏色和混合模式
(一)繪制顏色
給圖形上色可以用drawColor
方法,它有兩種形式。
第一種drawColor(color: common2D.Color, blendMode?: BlendMode): void
,這里的color
是ARGB
格式的顏色,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
模式,用了它,繪制區(qū)域就會變得全透明,就好像圖形隱身了一樣??创a:
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
混合模式填充矩形區(qū)域,再繪制藍色矩形。接著設置顏色為紅色,同樣用SRC
混合模式,然后繪制紅色圓形。運行這段代碼,就能看到一個藍色矩形上面有個紅色圓形的界面啦。
今天咱們學習了鴻蒙繪圖@ohos.graphics.drawing
模塊的基礎用法,包括導入模塊、繪制基本圖形、設置顏色和混合模式,還做了一個小案例。掌握了這些基礎,后面咱們就能繼續(xù)探索進階和高階的繪圖技巧,畫出更厲害的圖形啦!趕緊動手試試吧,要是遇到問題,多調(diào)試調(diào)試代碼,或者去官方文檔里找找答案。加油,期待大家畫出超酷的圖形!
也可以加入我們鴻蒙技術交流群,開發(fā)鴻蒙原生應用過程有啥問題都可以在群溝通,互相幫助,一起進步。
在開發(fā)鴻蒙原生應用的時候,需要用到圖表組件的也可以嘗試使用我們封裝的。圖表的官網(wǎng)地址:[meichuangit.net.cn/]
審核編輯 黃宇
-
API
+關注
關注
2文章
1620瀏覽量
64059 -
鴻蒙
+關注
關注
60文章
2620瀏覽量
44063
發(fā)布評論請先 登錄
米哈游啟動鴻蒙原生應用開發(fā),給程序員帶來了什么信息?
鴻蒙Harmony是如何影響Android工程師的呢?
HarmonyOS SDK,助力開發(fā)者打造煥然一新的鴻蒙原生應用
實錘!騰訊終于擁抱鴻蒙生態(tài),微信鴻蒙原生版本即將上線
鴻蒙原生開發(fā)手記:01-元服務開發(fā)
鴻蒙原生頁面高性能解決方案上線OpenHarmony社區(qū) 助力打造高性能原生應用
鴻蒙原生應用開發(fā)也可以使用DeepSeek了
Kuikly鴻蒙版正式開源 —— 揭秘卓越性能適配之旅
鴻蒙開發(fā)API9 到 API12,有哪些不同
繪圖的API函數(shù)

使用 Taro 開發(fā)鴻蒙原生應用 —— 快速上手,鴻蒙應用開發(fā)指南

評論