對于一些復(fù)雜或不規(guī)則的UI,我們可能無法使用現(xiàn)有的 Widget 組合去實(shí)現(xiàn),比如需要一個(gè)帶動(dòng)畫的進(jìn)度條,

銅梁網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,銅梁網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為銅梁上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個(gè)售后服務(wù)好的銅梁做網(wǎng)站的公司定做!
又或者是一個(gè)特殊形狀的多邊形等等,當(dāng)然有時(shí)候我們可以直接用圖片去實(shí)現(xiàn),但是并沒有達(dá)到我們想要
的效果,反而會讓我們產(chǎn)生不良的體驗(yàn)。
幾乎所有的UI系統(tǒng)都會提供一個(gè)自繪UI的接口,這個(gè)接口通常會提供一塊2D畫布Canvas,Canvas內(nèi)部封裝了
一些基本繪制的API,開發(fā)者可以通過Canvas繪制各種自定義圖形。在Flutter中,提供了一個(gè)CustomPaint Widget,
它可以結(jié)合一個(gè)畫筆CustomPainter來實(shí)現(xiàn)繪制自定義圖形。
我們看看 CustomPaint 構(gòu)造函數(shù):
1.painter: 背景畫筆,會顯示在子節(jié)點(diǎn)后面;
2.foregroundPainter: 前景畫筆,會顯示在子節(jié)點(diǎn)前面
3.size:當(dāng)child為null時(shí),代表默認(rèn)繪制區(qū)域大小,如果有child則忽略此參數(shù),畫布尺寸則為child尺寸。如果有child但是想指定畫布為特定大小,可以使用SizeBox包裹CustomPaint實(shí)現(xiàn)。
4.isComplex:是否復(fù)雜的繪制,如果是,F(xiàn)lutter會應(yīng)用一些緩存策略來減少重復(fù)渲染的開銷。
5.willChange:和isComplex配合使用,當(dāng)啟用緩存時(shí),該屬性代表在下一幀中繪制是否會改變。
可以看到,繪制時(shí)我們需要提供前景或者背景畫筆,兩者也可以同時(shí)提供,
我們的畫筆需要繼承 CustomPainter 類,我們在畫筆類中實(shí)現(xiàn)真正的繪制邏輯。
顧名思義畫布的意思,我們繪制布局當(dāng)然是在一張畫布上進(jìn)行繪制,畫布為我們繪制圖形提供了很多方法。(熟悉畫布的就無需再看了)
在繪制之前我們需要準(zhǔn)備畫筆 Paint,就如畫畫一樣,你用什么筆就能畫什么樣的畫,在Paint中,
我們可以配置畫筆的各種屬性如粗細(xì)、顏色、樣式等。如:
好了,繼承CustomPainter類,然后準(zhǔn)備好畫筆,就可以在畫布上盡情的揮灑了!
寫的挺簡單的,就是介紹了一下自定義view的準(zhǔn)備工作以及畫布畫筆的功能,具體實(shí)戰(zhàn)請看下一篇博客。
Flutter中自定義組件一般有兩種方式:
CustomPaint繼承自SingleChildRenderObjectWidget,即它可以在通過嵌套引入到widget樹中,并且可以有一個(gè)child子widget。它的構(gòu)造方法如下:
painter和foregroundPainter需要接收CustomPainter對象,是CustomPaint核心。CustomPainter是進(jìn)行UI繪制的核心類,繪制時(shí), CustomPaint 首先在畫布上調(diào)用 painter繪制 , 然后再繪制它的 child Widget, child 繪制完成后再調(diào)用 foregroundPainter 進(jìn)行繪制。
size屬性標(biāo)識繪制區(qū)域大小,但當(dāng)CustomPaint有child,該屬性將會忽略,而使用child的大小為繪制區(qū)域大小。
isComplex和willChange用于控制繪制層緩存處理的,這里暫不討論。
可實(shí)現(xiàn)CustomPainter子類進(jìn)行UI繪制
實(shí)現(xiàn)paint方法進(jìn)行真正的繪制,canvas是畫布對象,size是繪制區(qū)域,是從CustomPaint中size屬性傳遞得到的。繪制過程與Android原生開發(fā)十分類似,連API都十分相像,這點(diǎn)對熟悉Android原生開發(fā)者真是太友好了。
Paint對象是畫筆對象,就是繪圖工具,我們可以設(shè)置畫筆的顏色、粗細(xì)、是否抗鋸齒、筆觸形狀以及作畫風(fēng)格等,通過這些屬性我們可以很方便的來定制自己的UI效果,在繪制的過程中可以定義多個(gè)畫筆,以便實(shí)現(xiàn)多種風(fēng)格圖形的集合。
根據(jù)需求選擇合適的畫筆屬性,完成你的繪制。
Canvas是繪制的畫布,它包含了很多繪制方法,可以繪制出各種形狀的圖形。需要注意的是,畫布是應(yīng)用所有控件都在使用的, 所以通過這個(gè)畫布其實(shí)是可以繪制充滿屏幕的內(nèi)容的,每次繪制都應(yīng)該限制在本控件的區(qū)域(Size)內(nèi), 以免繪制覆蓋到其他組件。
下面介紹下Canvas的繪制方法:
PointMode是個(gè)枚舉
p1、p2為線段兩個(gè)端點(diǎn)
Rect定義矩形的大小位置,有多種構(gòu)造方式:
RRect描述圓角矩形,他通過Rect和Radius來構(gòu)造
畫圓比較簡單,c表示圓心位置,radius是半徑。
橢圓使用外接矩形確定大小位置,rect就是外接矩形。
繪制弧形,先確定弧形對應(yīng)的橢圓,同樣地用外接矩形rect確定橢圓,然后根據(jù)起始點(diǎn)和結(jié)束點(diǎn)角度來確定那一段弧度,startAngle,sweepAngle分別代表起始和結(jié)束點(diǎn)角度,角度用弧度表示法。
useCenter表示是否連接閉合形狀,userCenter = false表示不閉合,即畫一段弧線,userCenter = true表示閉合,即繪制一個(gè)扇形。
繪制路徑,關(guān)鍵在于構(gòu)建路徑Path,可以直接new Path對象,然后通過path方法可以連接出圖形,path關(guān)鍵方法如下:
還有其他方法,有興趣可以查看API。
CustomPaint class提供了讓用戶自定義widget的能力,它暴露了一個(gè)canvas,可以通過這個(gè)canvas來繪制widget,CustomPaint會先調(diào)用painter繪制背景,然后再繪制child,最后調(diào)用foregroundPainter來繪制前景,CustomPaint的定義如下
CustomPaint的繪制過程都將會交給CustomPainter來完成,CustomPainter是個(gè)抽象接口,在子類化CustomPainter的時(shí)候必須要重寫它的 paint 跟 shouldRepaint 接口,可以根據(jù)自己的場景來選擇性的重寫 hitTest 跟 shouldRebuildSemantics 方法。
canvas--畫布,真正的繪制是由canvas跟paint來完成的,畫布提供了各種繪制的接口來繪制圖形,除此以外畫布還提供了平移、縮放、旋轉(zhuǎn)等矩陣變換接口,畫布都有固定大小跟形狀,還可以使用畫布提供的裁剪接口來裁剪畫布的大小形狀等等。
常用的繪制接口有 更多請查看官方文檔
Paint---筆畫,是用來設(shè)置在畫布上面繪制圖形時(shí)的一些筆畫屬性,如:顏色、線寬、繪制模式、抗鋸齒等等。常用屬性有 更多請查看官方文檔
color : 設(shè)置畫筆顏色
isAntiAlias : 設(shè)置畫筆是否扛鋸齒
shader : 著色器,填充形狀或者畫線時(shí)用到,如果沒設(shè)置將會使用color
strokeWidth : 設(shè)置畫筆畫線寬度
style :繪制模式,畫線或充滿
下面這個(gè)例子來自于官方,通過 CustomPaint 畫出了一個(gè)藍(lán)天跟太陽出來
效果如下:
本文標(biāo)題:flutter畫布,flutter 畫中畫
路徑分享:http://chinadenli.net/article25/dsghoci.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、App設(shè)計(jì)、全網(wǎng)營銷推廣、品牌網(wǎng)站制作、做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)