Flutter中自定義組件一般有兩種方式:
為威縣等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及威縣網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站建設(shè)、威縣網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
CustomPaint繼承自SingleChildRenderObjectWidget,即它可以在通過嵌套引入到widget樹中,并且可以有一個child子widget。它的構(gòu)造方法如下:
painter和foregroundPainter需要接收CustomPainter對象,是CustomPaint核心。CustomPainter是進行UI繪制的核心類,繪制時, CustomPaint 首先在畫布上調(diào)用 painter繪制 , 然后再繪制它的 child Widget, child 繪制完成后再調(diào)用 foregroundPainter 進行繪制。
size屬性標識繪制區(qū)域大小,但當CustomPaint有child,該屬性將會忽略,而使用child的大小為繪制區(qū)域大小。
isComplex和willChange用于控制繪制層緩存處理的,這里暫不討論。
可實現(xiàn)CustomPainter子類進行UI繪制
實現(xiàn)paint方法進行真正的繪制,canvas是畫布對象,size是繪制區(qū)域,是從CustomPaint中size屬性傳遞得到的。繪制過程與Android原生開發(fā)十分類似,連API都十分相像,這點對熟悉Android原生開發(fā)者真是太友好了。
Paint對象是畫筆對象,就是繪圖工具,我們可以設(shè)置畫筆的顏色、粗細、是否抗鋸齒、筆觸形狀以及作畫風(fēng)格等,通過這些屬性我們可以很方便的來定制自己的UI效果,在繪制的過程中可以定義多個畫筆,以便實現(xiàn)多種風(fēng)格圖形的集合。
根據(jù)需求選擇合適的畫筆屬性,完成你的繪制。
Canvas是繪制的畫布,它包含了很多繪制方法,可以繪制出各種形狀的圖形。需要注意的是,畫布是應(yīng)用所有控件都在使用的, 所以通過這個畫布其實是可以繪制充滿屏幕的內(nèi)容的,每次繪制都應(yīng)該限制在本控件的區(qū)域(Size)內(nèi), 以免繪制覆蓋到其他組件。
下面介紹下Canvas的繪制方法:
PointMode是個枚舉
p1、p2為線段兩個端點
Rect定義矩形的大小位置,有多種構(gòu)造方式:
RRect描述圓角矩形,他通過Rect和Radius來構(gòu)造
畫圓比較簡單,c表示圓心位置,radius是半徑。
橢圓使用外接矩形確定大小位置,rect就是外接矩形。
繪制弧形,先確定弧形對應(yīng)的橢圓,同樣地用外接矩形rect確定橢圓,然后根據(jù)起始點和結(jié)束點角度來確定那一段弧度,startAngle,sweepAngle分別代表起始和結(jié)束點角度,角度用弧度表示法。
useCenter表示是否連接閉合形狀,userCenter = false表示不閉合,即畫一段弧線,userCenter = true表示閉合,即繪制一個扇形。
繪制路徑,關(guān)鍵在于構(gòu)建路徑Path,可以直接new Path對象,然后通過path方法可以連接出圖形,path關(guān)鍵方法如下:
還有其他方法,有興趣可以查看API。
附上開發(fā)環(huán)境:
折線圖是一個 Widget,和普通 Widget一樣聲明即可:
LineChart 的構(gòu)造參數(shù)是一個 LineChartData,其屬性如下:
配置了三條線,所以 lineBarsData 對應(yīng)的數(shù)組有三個元素。
看下 LineChartBarData 屬性:
圖表四個方向的邊框,有總顯示開關(guān),決定是否顯示和隱藏所有,如果開啟,又想隱藏個別邊框,需要設(shè)置透明色。
FlBorderData 對應(yīng)邊框信息,有兩個參數(shù), show 就是顯示與隱藏的邊框, border 是邊框數(shù)據(jù)。
FlTitlesData 可以配置4條坐標軸,也有一個總開關(guān),如果要顯示坐標軸,就設(shè)為 true ,然后配置對應(yīng)位置的數(shù)據(jù):
每個位置對應(yīng)的是 SideTitles ,設(shè)置如下:
標題是顯示在坐標軸后面的文字標題,每個軸對應(yīng)一個。
附上源碼
記錄一下charts_flutter 的使用過程
1.先在pubspec.yaml添加chart包依賴
我這里使用的版本是
2.定義數(shù)據(jù)類型
3.定義數(shù)據(jù)源
如下圖所示,下圖為兩條線同理可加兩條線
ListView的基礎(chǔ)創(chuàng)建使用有三種方式:
通過默認構(gòu)造函數(shù)來創(chuàng)建列表,應(yīng)用場景 = 短列表
這種方式創(chuàng)建的列表存在一個問題:對于那些長列表或者需要較昂貴渲染開銷的子組件,即使還沒有出現(xiàn)在屏幕中但仍然會被ListView所創(chuàng)建,這將是一項較大的開銷,使用不當可能引起性能問題甚至卡頓。
長列表
列表子項之間需要分割線
ListView的進階使用主要包括:下拉刷新 上拉加載
在Flutter中,ListView結(jié)合RefreshIndicator組件實現(xiàn)下拉刷新
通過包裹一層RefreshIndicator,自定義onRefresh回調(diào)方法實現(xiàn)
方式有兩種:
通過ListView.controller屬性可以判斷ListView是否滑動到了底部,再進行上拉加載
NotificationListener是一個Widget,可監(jiān)聽子Widget發(fā)出的Notification
ListView在滑動時中會發(fā)出ScrollNotification類型的通知,可通過監(jiān)聽該通知得到ListView的滑動狀態(tài),判斷是否滑動到了底部,從而進行上拉加載
NotificationListener有一個onNotification屬性,定義了監(jiān)聽的回調(diào)方法,通過它來處理加載更多邏輯
不定期分享關(guān)于 安卓開發(fā) 的干貨,追求 短、平、快 ,但 卻不缺深度 。
Element管理Widget和RenderObject。
widget保持顯示當前的頁面狀態(tài),當widget產(chǎn)生點擊等交互,調(diào)用setState()改變element中管理的state,
表格布局和線性布局比較相似,只是使用起來更簡潔一些。
本地Flutter 2.10.1,Mac版Android Studio Bumblebee | 2021.1.1 Patch 2
我是小栗子,初學(xué)Flutter ,文章會根據(jù)學(xué)習(xí)進度不定時更新,請多多指教~~