W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
當 Flutter 提供的現(xiàn)有組件無法滿足我們的需求,或者我們?yōu)榱斯蚕泶a需要封裝一些通用組件,這時我們就需要自定義組件。在 Flutter 中自定義組件有三種方式:通過組合其它組件、自繪和實現(xiàn) RenderObject。本節(jié)我們先分別介紹一下這三種方式的特點,后面章節(jié)中則詳細介紹它們的細節(jié)。
這種方式是通過拼裝其它組件來組合成一個新的組件。例如我們之前介紹的Container
就是一個組合組件,它是由DecoratedBox
、ConstrainedBox
、Transform
、Padding
、Align
等組件組成。
在 Flutter 中,組合的思想非常重要,F(xiàn)lutter 提供了非常多的基礎組件,而我們的界面開發(fā)其實就是按照需要組合這些組件來實現(xiàn)各種不同的布局而已。
如果遇到無法通過現(xiàn)有的組件來實現(xiàn)需要的 UI 時,我們可以通過自繪組件的方式來實現(xiàn),例如我們需要一個顏色漸變的圓形進度條,而 Flutter 提供的CircularProgressIndicator
并不支持在顯示精確進度時對進度條應用漸變色(其valueColor
屬性只支持執(zhí)行旋轉動畫時變化 Indicator 的顏色),這時最好的方法就是通過自定義組件來繪制出我們期望的外觀。我們可以通過 Flutter 中提供的CustomPaint
和Canvas
來實現(xiàn) UI 自繪。
Flutter 提供的自身具有 UI 外觀的組件,如文本Text
、Image
都是通過相應的RenderObject
(我們將在“Flutter 核心原理”一章中詳細介紹RenderObject
)渲染出來的,如 Text 是由RenderParagraph
渲染;而Image
是由RenderImage
渲染。RenderObject
是一個抽象類,它定義了一個抽象方法paint(...)
:
void paint(PaintingContext context, Offset offset)
PaintingContext
代表組件的繪制上下文,通過PaintingContext.canvas
可以獲得Canvas
,而繪制邏輯主要是通過Canvas
API 來實現(xiàn)。子類需要重寫此方法以實現(xiàn)自身的繪制邏輯,如RenderParagraph
需要實現(xiàn)文本繪制邏輯,而RenderImage
需要實現(xiàn)圖片繪制邏輯。
可以發(fā)現(xiàn),RenderObject
中最終也是通過Canvas
API來繪制的,那么通過實現(xiàn)RenderObject
的方式和上面介紹的通過CustomPaint
和Canvas
自繪的方式有什么區(qū)別?其實答案很簡單,CustomPaint
只是為了方便開發(fā)者封裝的一個代理類,它直接繼承自SingleChildRenderObjectWidget
,通過RenderCustomPaint
的paint
方法將Canvas
和畫筆Painter
(需要開發(fā)者實現(xiàn),后面章節(jié)介紹)連接起來實現(xiàn)了最終的繪制(繪制邏輯在Painter
中)。
“組合”是自定義組件最簡單的方法,在任何需要自定義組件的場景下,我們都應該優(yōu)先考慮是否能夠通過組合來實現(xiàn)。而自繪和通過實現(xiàn)RenderObject
的方法本質上是一樣的,都需要開發(fā)者調用Canvas
API 手動去繪制 UI,優(yōu)點是強大靈活,理論上可以實現(xiàn)任何外觀的 UI,而缺點是必須了解Canvas
API細節(jié),并且得自己去實現(xiàn)繪制邏輯。
在本章接下來的小節(jié)中,我們將通過一些實例來詳細介紹自定義 UI 的過程,由于后兩種方法本質是相同的,并且 Flutter 中很多基礎組件都是通過RenderObject
的形式來實現(xiàn)的,所以后續(xù)我們只介紹CustomPaint
和Canvas
的方式,讀者如果對自定義RenderObject
的方法好奇,可以查看 Flutter 中相關基礎組件對應的RenderObject
的實現(xiàn)源碼,如RenderParagraph
或RenderImage
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: