鴻蒙NEXT開發實戰:圖片顯示、幾何圖形與自定義繪制詳解

探索HarmonyOS NEXT強大的圖形渲染能力,從圖片展示到自定義繪圖

HarmonyOS NEXT作為華為自主研發的操作系統,為開發者提供了一套豐富而強大的圖形渲染能力。無論是顯示圖片、繪制幾何圖形,還是實現復雜的自定義繪圖,鴻蒙都提供了簡潔而高效的解決方案。

本文將詳細介紹鴻蒙NEXT中三種主要的圖形處理方式:圖片顯示、幾何圖形繪制和畫布自定義繪制。

1. 圖片顯示(Image組件)

Image組件是鴻蒙中用于顯示圖片的核心組件,它支持多種圖片格式和源類型,讓開發者能夠靈活地在應用中展示圖像內容。

基本用法和數據源類型

Image組件支持多種數據源,只需簡單調用即可顯示不同來源的圖片:

typescript

// 本地資源
Image('images/panda.jpg').width(100)// Resource資源
Image($r('app.media.cat')).width(100)// 網絡資源(需要申請權限)
Image('https://example.com/example.JPG').width(200)// 媒體庫資源
Image('file://media/Photos/5').width(200)// Base64資源
Image('data:image/png;base64,...').width(100)// PixelMap像素圖
@State image: PixelMap | undefined = undefined
Image(this.image).width(100).height(100)

網絡圖片權限申請

使用網絡圖片時,需要在module.json5文件中聲明網絡訪問權限:

json

{"module": {"requestPermissions": [{"name": "ohos.permission.INTERNET"}]}
}

常用屬性配置

Image組件提供了一系列屬性用于控制圖片顯示效果:

typescript

Image($r('app.media.cat')).width(100).height(200).objectFit(ImageFit.Fill) // 設置縮放類型.fillColor(Color.Blue)    // 設置SVG圖片的繪制顏色

objectFit屬性支持多種枚舉值,用于控制圖片的縮放行為:

屬性值說明
ImageFit.Contain保持寬高比進行縮小或者放大,使得圖片完全顯示在顯示邊界內
ImageFit.Cover保持寬高比進行縮小或者放大,使得圖片兩邊都大于或等于顯示邊界
ImageFit.Auto自適應顯示
ImageFit.Fill不保持寬高比進行放大縮小,使得圖片充滿顯示邊界
ImageFit.ScaleDown保持寬高比顯示,圖片縮小或者保持不變
ImageFit.None保持原有尺寸顯示

2. 繪制幾何圖形(Shape組件)

鴻蒙系統提供了強大的幾何圖形繪制能力,可以通過Shape組件及其子組件創建各種矢量圖形。

創建繪制組件

繪制組件可以由以下兩種形式創建:

形式一:繪制組件使用Shape作為父組件,實現類似SVG的效果。

typescript

// 創建帶有父組件的繪制組件
Shape() {Rect().width(300).height(50)Circle({ width: 150, height: 150 }).fill('red')
}

形式二:繪制組件單獨使用,直接在頁面上繪制指定圖形。

typescript

// 單獨使用繪制組件
Circle({ width: 150, height: 150 })

鴻蒙提供了7種基本繪制類型:Circle(圓形)、Ellipse(橢圓形)、Line(直線)、Polyline(折線)、Polygon(多邊形)、Path(路徑)、Rect(矩形)。

形狀視口viewport

Shape組件支持viewport屬性,用于指定用戶空間中的一個矩形,該矩形映射到為關聯的SVG元素建立的視區邊界。

typescript

Shape() {Rect().width(300).height(50)
}
.viewPort({x: 0,y: 0,width: 300,height: 100,
})

viewport屬性包含四個可選參數:

  • x?和?y:表示視區的左上角坐標

  • width?和?height:表示視區尺寸

通過viewport可以實現圖形的放大與縮小效果:

typescript

// 通過viewport對圖形進行放大與縮小
Row({space:10}) {Column() {// 放大效果Shape() {Rect().width('100%').height('100%').fill('#0097D4')Circle({width: 75, height: 75}).fill('#E87361')}.viewPort({x: 0, y: 0, width: 75, height: 75}).width(150).height(150)}Column() {// 縮小效果Shape() {Rect().width('100%').height('100%').fill('#BDDB69')Circle({width: 75, height: 75}).fill('#E87361')}.viewPort({x: 0, y: 0, width: 300, height: 300}).width(150).height(150)}
}

自定義樣式

繪制組件支持多種屬性來自定義樣式:

typescript

// 設置填充顏色
Path().width(100).height(100).commands('M150 0 L300 300 L0 300 Z').fill("#E87361")// 設置邊框顏色
Path().width(100).height(100).fillOpacity(0).commands('M150 0 L300 300 L0 300 Z').stroke(Color.Red)// 設置邊框透明度
Path().width(100).height(100).fillOpacity(0).commands('M150 0 L300 300 L0 300 Z').stroke(Color.Red).strokeWidth(10).strokeOpacity(0.2)// 設置線條拐角樣式
Polyline().width(100).height(100).fillOpacity(0).stroke(Color.Red).strokeWidth(8).points([[20, 0], [0, 100], [100, 90]]).strokeLineJoin(LineJoinStyle.Round) // 圓角連接// 設置斜接長度與邊框寬度比值
Polyline().width(100).height(100).fillOpacity(0).stroke(Color.Red).strokeWidth(10).points([[20, 0], [20, 100], [100, 100]]).strokeLineJoin(LineJoinStyle.Miter) // 尖角連接.strokeMiterLimit(1/Math.sin(45))    // 設置比值

3. 使用畫布繪制自定義圖形(Canvas組件)

對于更復雜的繪圖需求,鴻蒙提供了Canvas組件,允許開發者進行完全自定義的圖形繪制。

初始化畫布組件

Canvas組件使用前需要初始化,并通過onReady事件回調進行繪制操作:

typescript

// 配置CanvasRenderingContext2D對象參數
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)// 初始化畫布組件
Canvas(this.context).width('100%').height('100%').backgroundColor('#F5DC62').onReady(() => {// 在onReady回調中進行繪制操作this.context.fillStyle = '#0097D4';this.context.fillRect(50, 50, 100, 100);})

畫布繪制方式

Canvas組件提供了兩種繪制方式:

方式一:直接調用CanvasRenderingContext2D對象的API進行繪制

typescript

Canvas(this.context).onReady(() =>{this.context.beginPath();this.context.moveTo(50, 50);this.context.lineTo(280, 160);this.context.stroke();})

方式二:先定義Path2D對象構造路徑,再進行繪制

typescript

Canvas(this.context).onReady(() =>{let region = new Path2D();region.arc(100, 75, 50, 0, 6.28);this.context.stroke(region);})

離屏繪制

離屏繪制(offscreen rendering)允許將渲染結果繪制到與屏幕不直接相關的緩沖區中進行處理,適用于實現陰影、模糊、遮罩等特殊效果。

typescript

// 離屏繪制示例
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
// 創建離屏畫布上下文
private offContext: OffscreenCanvasRenderingContext2D = new OffscreenCanvasRenderingContext2D(600, 600, this.settings)Canvas(this.context).width('100%').height('100%').backgroundColor('#F5DC62').onReady(() =>{// 在離屏畫布上繪制this.offContext.strokeRect(50, 50, 200, 150);// 將離屏繪制的圖像在普通畫布上顯示let image = this.offContext.transferToImageBitmap();this.context.transferFromImageBitmap(image);})

畫布常用繪制方法

Canvas組件提供了豐富的API用于繪制各種圖形和效果:

基礎形狀繪制

typescript

Canvas(this.context).onReady(() =>{// 繪制矩形this.context.beginPath();this.context.rect(100, 50, 100, 100);this.context.stroke();// 繪制圓形this.context.beginPath();this.context.arc(150, 250, 50, 0, 6.28);this.context.stroke();// 繪制橢圓this.context.beginPath();this.context.ellipse(150, 450, 50, 100, Math.PI * 0.25, Math.PI * 0, Math.PI * 2);this.context.stroke();})

文本繪制

typescript

Canvas(this.context).onReady(() =>{// 繪制填充類文本this.context.font = '50px sans-serif';this.context.fillText("Hello World!", 50, 100);// 繪制描邊類文本this.context.font = '55px sans-serif';this.context.strokeText("Hello World!", 50, 150);})

漸變效果

typescript

Canvas(this.context).onReady(() =>{// 創建徑向漸變色let grad = this.context.createRadialGradient(200,200,50, 200,200,200)// 設置漸變斷點值grad.addColorStop(0.0, '#E87361');grad.addColorStop(0.5, '#FFFFF0');grad.addColorStop(1.0, '#BDDB69');// 使用漸變色填充矩形this.context.fillStyle = grad;this.context.fillRect(0, 0, 400, 400);})

繪制圖片和圖像像素處理

Canvas組件還支持通過drawImage方法繪制圖片,以及通過createImageData、getPixelMap、getImageData等方法進行圖像像素信息處理。

實戰示例:繪制一個簡單的自定義圖形

下面是一個綜合運用Shape和Canvas組件繪制自定義圖形的完整示例:

typescript

@Entry
@Component
struct CustomGraphicsExample {private settings: RenderingContextSettings = new RenderingContextSettings(true)private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)build() {Column({ space: 10 }) {// 使用Shape組件繪制幾何圖形Shape() {Circle({ width: 100, height: 100 }).fill('#E87361')Rect().width(200).height(50).fill('#0097D4')}.viewPort({ x: 0, y: 0, width: 300, height: 150 }).width(300).height(150).backgroundColor('#F5DC62')// 使用Canvas組件繪制自定義圖形Canvas(this.context).width(300).height(300).backgroundColor('#FFFFFF').onReady(() => {// 繪制矩形this.context.fillStyle = '#0097D4';this.context.fillRect(50, 50, 100, 100);// 繪制圓形this.context.beginPath();this.context.arc(200, 200, 50, 0, 6.28);this.context.fillStyle = '#E87361';this.context.fill();// 繪制文本this.context.font = '20px sans-serif';this.context.fillStyle = '#000000';this.context.fillText("HarmonyOS NEXT", 60, 250);})}.width('100%').height('100%').padding(20)}
}

總結

HarmonyOS NEXT提供了豐富而強大的圖形渲染能力,從簡單的圖片顯示到復雜的自定義繪圖,都能滿足開發者的各種需求:

  1. Image組件簡單易用,支持多種圖片源和顯示效果控制,適合大多數圖片展示場景。

  2. Shape組件提供了聲明式的矢量圖形繪制方式,支持7種基本幾何圖形和豐富的樣式配置,適合繪制簡單的矢量圖形。

  3. Canvas組件提供了底層的繪圖API,支持完全自定義的圖形繪制,適合復雜的繪圖需求和動態圖形效果。

無論是開發簡單的圖片展示功能,還是實現復雜的自定義圖形繪制,鴻蒙NEXT都能提供合適的解決方案。希望通過本文的介紹,能幫助您更好地理解和運用鴻蒙的圖形渲染能力,開發出更加美觀和功能豐富的應用。

溫馨提示:在實際開發中,請注意根據需求選擇合適的圖形渲染方式。對于簡單的靜態圖形,優先考慮使用Shape組件;對于復雜的動態圖形,再考慮使用Canvas組件。同時,使用網絡圖片時別忘了申請相應的權限。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96126.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96126.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96126.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python + Flask模塊學習 2 接收用戶請求并返回json數據

用到的模塊還是flask,用到的類有Flask, request, jsonfiy 🙂 目錄 1、GET請求 2、POST請求 1、表單格式 2、json格式 就醬,也比較簡單,下一篇說簡單的授權,簡單來說就是比如用戶付費買了服…

國內外常用的免費BUG管理工具選型

幫助用戶根據自身情況做決定,比如團隊規模、技術能力、是否需要移動端支持等。避免只是羅列工具,而是提供實際選擇的維度。 國內外常用的免費BUG管理工具選擇非常豐富,從輕量級到功能全面型都有覆蓋。我將它們分為幾類,并詳細介紹…

JavaScript的事件循環機制

1.事件循環的理解JavaScript是單線程的,意味著它一次只能執行一個任務。而事件循環就是去協調在JavaScript環境中運行的同步任務、異步任務(微任務、宏任務)的執行順序的一種機制。它是 JavaScript 實現單線程非阻塞異步執行的核心。2.事件循環的執行順序同步任務—…

數據結構——棧(Java)

目錄 一定義. 入棧 出棧 二.棧與線性表的關系 三.棧的實現方式 四.鏈表實現棧 1.結點的API設計 2.棧的API設計 2.1棧的初始化設計 2.2元素入棧 2.3元素出棧 五.括號匹配問題 完整代碼展示 答案 一定義. 棧是一種基于先進后出(FILO)的數據…

科研筆記:數學建模啟發的課題研究方法

借鑒數學建模的思路解決科學問題或開展課題研究,核心是將實際問題抽象為數學框架,通過定量分析、邏輯推演和驗證優化,實現對問題的精準描述、解釋或預測。其本質是“從現實到數學,再從數學回歸現實”的迭代過程,適用于…

Agent落地到底選擇LangChain 還是 LangGraph

核心概念 LangChain:一個用于構建由大型語言模型驅動的應用程序的框架。它提供了大量的組件和現成的鏈,旨在簡化和標準化應用程序與LLM交互的過程。 LangGraph:一個用于在LangChain之上構建有狀態、多參與者的 工作流 的庫。它特別擅長處理具有循環、分支和復雜協調的代理(…

ChatGPT下的相關聊天提示詞

問:如果我覺得一個子對話里,聊天聊得太多,在這個項目下新開一個子對話,但是不想把上次太多的信息 都復制過來,有沒有什么辦法關鍵詞:項目、子對話,上下文ChatGPT:有辦法的 ?在 ChatGPT 里&…

最新PDF版本!Acrobat Pro DC 2025,解壓即用版

軟件介紹 Adobe Acrobat Pro DC 2025 是全球知名的 PDF 編輯神器,被稱為 “最牛 PDF 工具”,能輕松解決 PDF 編輯、創建、轉換等難題,本次分享的版本解壓即可使用。 軟件特點 然解壓即可使用不用登錄注冊最新版本 軟件使用 我們打開軟件選…

XX汽集團數字化轉型:全生命周期網絡安全、數據合規與AI工業物聯網融合實踐

引言:數字化轉型中的安全與效率雙輪驅動作為中國汽車行業的龍頭企業,XX汽集團近年來積極推進數字化轉型,通過構建全生命周期網絡安全體系、完善數據合規治理框架,并深度融合AI工業物聯網技術,實現了生產成本顯著降低和…

云原生部署_Docker入門

Docker是啥Docker是一個開源的容器化平臺,可以幫助開發者將應用程序和其依賴的環境打包成一個可移植、可部署的容器。Docker的主要目標是通過容器化技術,實現應用程序的快速部署、可移植性和可擴展性,從而簡化應用程序的開發、測試和部署過程…

【大數據專欄】大數據框架-Apache Druid Overview

目錄 Architecture Advantages and disadvantages 從架構以及設計可以得出結論,Durid不支持ACID事務,基于時間戳列和維度列去查詢,所以適合基于時間做分組和學列的查詢操作。 Advantages優勢: 實時數據攝取與查詢 支持秒級數據攝…

云平臺面試內容(一)

1. 云計算的優點、服務模型區別及云部署模式 云計算優點: 云計算具有顯著的優勢,包括無需自建機房和硬件投入,資源即開即用并支持彈性伸縮,按需付費使成本透明可控。企業可以在數分鐘內完成全球范圍的部署,縮短上線周期。同時云平臺提供高可用性和安全性,多副本容災保證數…

嵌入式 - 硬件:51單片機(2)

本節重點:1. GPIO輸入模式、輸出模式2. 按鍵工作原理(GPIO輸入)3. 中斷概念4. 中斷源概念、中斷源個數、哪幾個中斷源5. 外部中斷、定時器中斷概念6. 中斷處理流程:7. 51單片機中定時器的個數?類型8. 16位定時器和8位…

C語言中奇技淫巧07-使用GCC棧保護選項檢測程序棧溢出

-fstack-protector 是 GCC 和 Clang 編譯器提供的一種棧保護(Stack Smashing Protection, SSP) 機制,用于檢測和防御常見的緩沖區溢出攻擊(特別是棧溢出)。它通過在函數的棧幀中插入特殊的“金絲雀值”(can…

.NET 8.0 Web API JWT 身份驗證和基于角色的授權

在當今的數字環境中,保護 Web 應用程序的安全至關重要。隨著 .NET 8.0 的不斷發展,它提供了強大的工具來確保您的 API 既安全又高效。 示例代碼:https://download.csdn.net/download/hefeng_aspnet/91490262 如果您喜歡此文章&#xff0c…

ZYNQ SDK軟件在線調試

1、然后右鍵項目->debug as->launch on hardware2、從左到右分別是:運行程序到設置的斷點暫停運行終止斷開連接步進(進入函數內部)跳過(不進入函數內部)跳出函數3、雙擊添加斷點,然后點擊運行可以讓程…

四大金剛之計算機操作系統

1. 進程和線程的區別?創建線程的代價比創建進程小嗎?進程是資源分配和調度的基本單位;線程是 CPU 調度的基本單位。進程有獨立的地址空間,線程共享進程地址空間。創建/銷毀進程開銷大,線程開銷小。是的,因為…

redis--redis.conf的相關配置問題

關于redis.conf內的相關重要的配置介紹 1. bind 配置 僅僅設置bind,還需要搭配下面的rotected-mode 配置才能外部ip進行連接 功能:設置 Redis 監聽的 IP 地址,決定哪些設備可以連接到 Redis 服務器。 bind 127.0.0.1:只允許本機&a…

unsloth 筆記:從最近的檢查點繼續微調

檢查點(checkpointing)可以把微調進度保存下來,這樣可以中途暫停,隨后繼續訓練。首先需要在 Trainer 的參數里添加 save_strategy 和 save_steps。trainer SFTTrainer(....args TrainingArguments(....output_dir "output…

DevOps平臺選型指南:破解研發效率瓶頸,適配金融/政務/國產化場景的5大關鍵指標

在數字化轉型的浪潮中,軟件研發效能已成為企業的核心競爭力。然而,許多團隊在追求敏捷與高速交付的過程中,常常會遇到工具鏈割裂、流程冗長、環境混亂等效率瓶頸。選擇一個合適的、一體化的DevOps平臺,是破解這些瓶頸、實現研發運…