在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙原生繪圖API:從基礎(chǔ)到高階的繪制之旅(進(jìn)階版)

陳姚豐 ? 來(lái)源:jf_83680738 ? 作者:jf_83680738 ? 2025-03-16 15:57 ? 次閱讀
theme: hydrogen

家人們,還記得上次一起探索的鴻蒙繪圖API基礎(chǔ)用法嗎?上手是不是特別容易!今天,咱們就接著深入,開(kāi)啟進(jìn)階版的學(xué)習(xí),解鎖更多復(fù)雜又炫酷的繪圖技能,讓你的鴻蒙應(yīng)用界面直接“出圈”!

我將結(jié)合實(shí)際開(kāi)發(fā)場(chǎng)景,豐富繪制路徑、圓角矩形、繪制圖片、畫(huà)筆與畫(huà)刷、裁剪區(qū)域設(shè)置這幾個(gè)方面的案例,讓示例更具實(shí)操性和參考價(jià)值。

一、復(fù)雜圖形繪制

(一)路徑繪制

當(dāng)繪制不規(guī)則圖形,比如獨(dú)特的圖標(biāo)、創(chuàng)意的裝飾元素時(shí),Path類(lèi)就成了得力助手,它能幫我們創(chuàng)建并操控各種復(fù)雜路徑。這些路徑可以由直線、弧線、貝塞爾曲線等組合而成。

創(chuàng)建路徑對(duì)象很簡(jiǎn)單:

let path = new drawing.Path();

接著設(shè)置路徑起始點(diǎn):

path.moveTo(10, 10);

然后添加線段:

path.lineTo(100, 100);

繪制弧線也不難:

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

除了弧線,還能使用二階貝塞爾曲線(quadTo)和三階貝塞爾曲線(cubicTo) 。

案例:繪制一個(gè)五角星
五角星的繪制需要結(jié)合直線和貝塞爾曲線,利用Path類(lèi)的相關(guān)方法,通過(guò)精確計(jì)算每個(gè)頂點(diǎn)的坐標(biāo)來(lái)實(shí)現(xiàn)。

let path = new drawing.Path();
// 五角星的半徑
const radius = 100;
// 計(jì)算五角星頂點(diǎn)坐標(biāo)的輔助函數(shù)
function calculateVertex(angle) {
    return {
        x: Math.sin(angle) * radius + 200,
        y: -Math.cos(angle) * radius + 200
    };
}
// 五角星的內(nèi)角角度
const angles = [
    0,
    Math.PI * 2 / 5,
    Math.PI * 4 / 5,
    Math.PI * 6 / 5,
    Math.PI * 8 / 5
];
// 移動(dòng)到第一個(gè)頂點(diǎn)
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();
// 附加畫(huà)筆并繪制路徑
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();

在這個(gè)案例中,通過(guò)數(shù)學(xué)計(jì)算得到五角星每個(gè)頂點(diǎn)的坐標(biāo),利用moveTolineTo方法依次連接各個(gè)頂點(diǎn),最后使用close方法閉合路徑,實(shí)現(xiàn)五角星的繪制。

(二)圓角矩形繪制

在追求界面美觀與柔和的設(shè)計(jì)中,圓角矩形很常用。使用drawRoundRect方法可以實(shí)現(xiàn):

drawRoundRect(roundRect: RoundRect): void

其中,RoundRect對(duì)象包含了矩形的位置、大小以及圓角半徑信息。

案例:繪制一個(gè)卡片式布局
在很多應(yīng)用中,卡片式布局很常見(jiàn),使用圓角矩形可以輕松實(shí)現(xiàn)。

import { common2D, drawing } from '@kit.ArkGraphics2D';
// 卡片的位置和大小
let rect = { left: 50, top: 50, right: 250, bottom: 150 };
// 圓角半徑
let roundRect = new drawing.RoundRect(rect, 15, 15);
// 附加畫(huà)刷設(shè)置背景顏色
let brush = new drawing.Brush();
brush.setColor({ alpha: 255, red: 240, green: 240, blue: 240 });
canvas.attachBrush(brush);
canvas.drawRoundRect(roundRect);
canvas.detachBrush();
// 附加畫(huà)筆繪制邊框
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();

在這個(gè)案例中,先定義了卡片的位置、大小和圓角半徑,創(chuàng)建RoundRect對(duì)象。然后分別使用畫(huà)刷設(shè)置背景顏色,使用畫(huà)筆繪制邊框,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的卡片式布局。

二、圖像繪制

(一)繪制圖片

在應(yīng)用開(kāi)發(fā)中,在畫(huà)布上繪制圖片很常見(jiàn)。drawImage系列方法可以滿(mǎn)足需求:

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

pixelmap是要繪制的圖片對(duì)象,lefttop指定圖片在畫(huà)布上的位置,samplingOptions用于設(shè)置采樣選項(xiàng)(API version 12+支持)。

從API version 12開(kāi)始,新增了更靈活的方法。drawImageRect可以將圖片繪制到指定區(qū)域:

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

drawImageRectWithSrc則能將圖片的指定區(qū)域繪制到畫(huà)布的指定區(qū)域:

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

案例:制作一個(gè)圖片畫(huà)廊
假設(shè)我們要制作一個(gè)簡(jiǎn)單的圖片畫(huà)廊,展示三張圖片,并且對(duì)其中一張圖片進(jìn)行局部放大展示。

import { image, drawing, common2D } from '@kit.ArkUI';
// 加載三張圖片
Promise.all([
    image.createPixelMap(/* 圖片1數(shù)據(jù) */),
    image.createPixelMap(/* 圖片2數(shù)據(jù) */),
    image.createPixelMap(/* 圖片3數(shù)據(jù) */)
]).then(([pixelMap1, pixelMap2, pixelMap3]) = > {
    // 繪制第一張圖片
    canvas.drawImage(pixelMap1, 20, 20);
    // 繪制第二張圖片
    canvas.drawImage(pixelMap2, 150, 20);
    // 繪制第三張圖片,并對(duì)其局部放大展示
    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);
});

在這個(gè)案例中,使用Promise.all同時(shí)加載三張圖片,然后分別使用drawImagedrawImageRectWithSrc方法將圖片繪制到畫(huà)布上,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的圖片畫(huà)廊效果,并且對(duì)第三張圖片進(jìn)行了局部放大展示。

三、繪制狀態(tài)與屬性設(shè)置

(一)畫(huà)筆與畫(huà)刷

在繪制圖形時(shí),Pen類(lèi)和Brush類(lèi)能幫我們?cè)O(shè)置線條和填充屬性,讓圖形更具個(gè)性。

Pen類(lèi)可以設(shè)置線條顏色、寬度、是否抗鋸齒等。

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類(lèi)用于設(shè)置填充屬性,比如填充顏色。

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();

案例:繪制一個(gè)立體按鈕
通過(guò)畫(huà)筆和畫(huà)刷的配合,可以繪制出具有立體感的按鈕。

// 繪制按鈕背景
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();

在這個(gè)案例中,先使用畫(huà)刷繪制按鈕的背景,然后通過(guò)畫(huà)筆分別設(shè)置不同顏色繪制邊框,模擬出立體效果。

(二)裁剪區(qū)域設(shè)置

有時(shí)候,我們只想在畫(huà)布的特定區(qū)域進(jìn)行繪制,clipRect方法可以實(shí)現(xiàn):

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

第一個(gè)參數(shù)指定裁剪區(qū)域的矩形,第二個(gè)參數(shù)是裁剪操作類(lèi)型,ClipOp.DIFFERENCE表示取差集,即只保留畫(huà)布上不在裁剪區(qū)域內(nèi)的部分;第三個(gè)參數(shù)表示是否反轉(zhuǎn)裁剪區(qū)域。

案例:制作一個(gè)圖片蒙版效果
通過(guò)設(shè)置裁剪區(qū)域,可以制作圖片蒙版效果。

import { image, drawing, common2D } from '@kit.ArkUI';
image.createPixelMap(/* 圖片數(shù)據(jù) */).then((pixelMap) = > {
    // 設(shè)置裁剪區(qū)域?yàn)閳A形
    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);
    // 清除裁剪區(qū)域
    canvas.restore();
});

在這個(gè)案例中,先創(chuàng)建一個(gè)圓形路徑,使用clipPath方法設(shè)置裁剪區(qū)域?yàn)閳A形,然后繪制圖片,這樣圖片就只會(huì)顯示在圓形區(qū)域內(nèi),實(shí)現(xiàn)了圖片蒙版效果。最后使用restore方法清除裁剪區(qū)域,以便后續(xù)正常繪制。

家人們,到這里,鴻蒙繪圖API的進(jìn)階內(nèi)容就學(xué)完啦!是不是感覺(jué)自己離大神又近了一步?趕緊動(dòng)手實(shí)踐,把這些知識(shí)運(yùn)用到實(shí)際開(kāi)發(fā)中。要是遇到問(wèn)題,別擔(dān)心,去官方文檔里找找答案,或者和技術(shù)交流群里的小伙伴們一起討論。下一次,咱們將挑戰(zhàn)高階版,一起探索更高級(jí)的繪圖技巧,期待與大家共同進(jìn)步!

在開(kāi)發(fā)鴻蒙原生應(yīng)用的時(shí)候,需要用到圖表組件的也可以嘗試使用我們封裝的。圖表的官網(wǎng)地址:[meichuangit.net.cn/]

如果你對(duì)案例還有其他修改意見(jiàn),比如增減特定場(chǎng)景案例、調(diào)整代碼注釋等,歡迎隨時(shí)提出。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1545

    瀏覽量

    63195
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2464

    瀏覽量

    43569
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    米哈游啟動(dòng)鴻蒙原生應(yīng)用開(kāi)發(fā),給程序員帶來(lái)了什么信息?

    首先,不止米哈與鴻蒙合作原生應(yīng)用開(kāi)發(fā)。在這之前還有其他互聯(lián)網(wǎng)大廠已經(jīng)與鴻蒙開(kāi)發(fā)合作。HarmonyOS NEXT系統(tǒng)也在積極籌備中,已有400多家合作伙伴加入,全面啟動(dòng)了鴻蒙
    發(fā)表于 01-07 22:25

    鴻蒙Harmony是如何影響Android工程師的呢?

    官宣開(kāi)始進(jìn)行鴻蒙原生應(yīng)用的研發(fā)之旅。迄今為止,已有超過(guò) 400 家合作伙伴投身其中,共同投入鴻蒙原生
    發(fā)表于 01-14 22:14

    HarmonyOS SDK,助力開(kāi)發(fā)者打造煥然一新的鴻蒙原生應(yīng)用

    鴻蒙生態(tài)千帆啟航儀式于 1 月 18 日正式啟動(dòng)。 2019 年 HarmonyOS 正式發(fā)布 2020 年“沒(méi)有人能夠熄滅漫天星光”,今天,滿(mǎn)天星光終匯成璀璨星河,HarmonyOS NEXT
    發(fā)表于 01-19 10:31

    實(shí)錘!騰訊終于擁抱鴻蒙生態(tài),微信鴻蒙原生版本即將上線

    大家都知道, 目前已知純血鴻蒙星河版next將于今年6月份開(kāi)啟Bate版本的測(cè)試 ,也就是說(shuō)原生鴻蒙系統(tǒng)快上線了。 而目前對(duì)于鴻蒙生態(tài)的發(fā)展,大家最關(guān)心的恐怕只有騰訊系的微信和QQ是否
    發(fā)表于 04-30 21:14

    鴻蒙原生開(kāi)發(fā)手記:01-元服務(wù)開(kāi)發(fā)

    簡(jiǎn)介 元服務(wù)是鴻蒙中的一種輕量應(yīng)用形態(tài),無(wú)需下載,直接運(yùn)行。類(lèi)似于微信小程序,但與小程序不同的是,元服務(wù)更加輕量。 元服務(wù)使用原生開(kāi)發(fā),是系統(tǒng)級(jí)提供的,無(wú)論易用性、性能、體驗(yàn)上,都要比小程序好
    發(fā)表于 11-14 17:28

    鴻蒙原生頁(yè)面高性能解決方案上線OpenHarmony社區(qū) 助力打造高性能原生應(yīng)用

    NEXT的原生頁(yè)面高性能解決方案,頁(yè)面滑動(dòng)、跳轉(zhuǎn)及應(yīng)用冷啟動(dòng)等關(guān)鍵環(huán)節(jié),為開(kāi)發(fā)者提供全面的支持。目前,這些解決方案均已上線OpenHarmony開(kāi)源社區(qū),可在OpenHarmony三方庫(kù)中心倉(cāng)進(jìn)行搜索,歡迎開(kāi)發(fā)者多多使用和共建,打造更極致性能的
    發(fā)表于 01-02 18:00

    鴻蒙原生應(yīng)用開(kāi)發(fā)也可以使用DeepSeek了

    和無(wú)私奉獻(xiàn)的辛勤工作,才讓我們能夠輕松地將強(qiáng)大的DeepSeek模型集成鴻蒙原生應(yīng)用的開(kāi)發(fā)環(huán)境中,為開(kāi)發(fā)效率的提升提供了強(qiáng)大的技術(shù)支持,向他們的這種精神和奉獻(xiàn)致敬! 下載鏈接:http
    發(fā)表于 02-20 18:06

    繪圖API函數(shù)

    繪圖API函數(shù) 一、 實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)使用嵌入式系統(tǒng)的繪圖API 函數(shù)。理解繪圖設(shè)備上下文(DC)在多任務(wù)操作系統(tǒng)中的作用。會(huì)使用繪
    發(fā)表于 12-25 23:56 ?2085次閱讀
    <b class='flag-5'>繪圖</b>的<b class='flag-5'>API</b>函數(shù)

    《MATLAB進(jìn)階》程序與數(shù)據(jù)資料下載

    《MATLAB進(jìn)階》程序與數(shù)據(jù)
    發(fā)表于 01-13 10:09 ?18次下載

    Docs倉(cāng) 開(kāi)啟OpenHarmony社區(qū)達(dá)人進(jìn)階之旅

    OpenHarmony 社區(qū)貢獻(xiàn)進(jìn)階之旅》。她:文檔的作用、好文檔的三個(gè)特性、文檔貢獻(xiàn)的形式、文檔 PR 的類(lèi)別、OpenHarmony社區(qū)文檔類(lèi)型等 6 個(gè)方面為大家詳細(xì)介紹
    的頭像 發(fā)表于 06-30 15:17 ?1060次閱讀

    【C語(yǔ)言進(jìn)階】C語(yǔ)言指針的高階用法

    【C語(yǔ)言進(jìn)階】C語(yǔ)言指針的高階用法
    的頭像 發(fā)表于 08-31 13:24 ?2565次閱讀

    串口屏LUA教程7-繪圖API使用說(shuō)明

    串口屏LUA教程7-繪圖API使用說(shuō)明
    發(fā)表于 04-29 13:12 ?13次下載

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

    隨著鴻蒙系統(tǒng)的不斷完善,許多應(yīng)用廠商都希望將自己的應(yīng)用移植鴻蒙平臺(tái)上。最近,Taro 發(fā)布了 v4.0.0-beta.x 版本,支持使用 Taro 快速開(kāi)發(fā)鴻蒙
    的頭像 發(fā)表于 02-02 16:09 ?1159次閱讀
    使用 Taro 開(kāi)發(fā)<b class='flag-5'>鴻蒙</b><b class='flag-5'>原生</b>應(yīng)用 —— 快速上手,<b class='flag-5'>鴻蒙</b>應(yīng)用開(kāi)發(fā)指南

    華為所有新手機(jī)將搭載鴻蒙 余承東:2025年起華為新品將全部搭載原生鴻蒙系統(tǒng)

    鴻蒙兩個(gè)選擇,但是2015年華為新品將全部搭載原生鴻蒙。 Mate70 / Pro / Pro+ 及 Mate X6 系列旗艦手機(jī)支持到手即可升級(jí)
    的頭像 發(fā)表于 11-27 15:42 ?3694次閱讀

    鴻蒙原生繪圖API基礎(chǔ)高階繪制之旅(基礎(chǔ)版)

    ArkTs的性能瓶頸,導(dǎo)致現(xiàn)在又要重構(gòu)開(kāi)發(fā)。于是我重新翻閱文檔,看看有沒(méi)有新的方式來(lái)解決。在翻閱官網(wǎng)文檔的時(shí)候,無(wú)意間看到這句話(huà)。 發(fā)現(xiàn)了 @ohos.graphics.drawing 模塊性能竟然比canvas好,所以最近我有時(shí)間都在學(xué)習(xí)這個(gè)API的功能,準(zhǔn)備將莓創(chuàng)圖表(mccharts)進(jìn)行性能升級(jí),打造
    的頭像 發(fā)表于 03-16 15:58 ?283次閱讀
    主站蜘蛛池模板: 亚洲精品久久久久午夜福 | 欧美影院一区二区 | 日韩黄a级成人毛片 | 婷婷五月情| 大尺度视频网站久久久久久久久 | 99热.com| 免费观看黄色在线视频 | 亚洲国产欧美日韩一区二区三区 | 国产一级特黄毛片 | 亚洲男人天堂2020 | 大黄网站色多多 | 日本日本69xxxx | 一级@片 | 国产一级特黄 | 黄色毛片免费进入 | 偷偷狠狠的日日2020 | 一区二区影视 | 日本精品视频四虎在线观看 | 亚洲 欧美 日韩 在线 中文字幕 | 免费毛片网站在线观看 | 永久网站色视频在线观看免费 | 噜噜噜 综合 亚洲 | 九九免费久久这里有精品23 | 4hu四虎永久免在线视 | 久久久精品免费观看 | xvideos国产 | 亚洲乱亚洲乱妇13p 亚洲免费mv | 国产一区二区三区夜色 | 久久精品1 | 超h 高h 污肉男男 | 黄色精品视频 | 一区二区三区免费精品视频 | 不卡视频一区 | 91亚洲国产成人久久精品网站 | 黄 色 录像成 人播放免费 | 亚洲成av人片在线观看无码 | 欧美在线观看www | 免费视频在线播放 | 国产大片91精品免费观看不卡 | 久久青草18免费观看网站 | 人人澡人人澡人人看青草 |