最近flutter專案新需求中需要實現圓弧樣式,如下圖所示:
在flutter自身ui元件中好像也沒有直接可用圓弧並帶缺口的元件。所以圓弧樣式就需要自己自定義繪製了。 在flutter中同樣也有畫布功能用於開發者繪製自定義樣式。
畫布元件custompaint,繪製內容通過painter和foregroundpainter。painter繪製在child之前,foregroundpainter繪製在child之後,因此child內容覆蓋在painter上層,foregroundpainter內容覆蓋在child上層。
custompaint(
painter: canvaspainter(),
foregroundpainter: foregroundpainter(),
child: container(
height: 50,
decoration: boxdecoration(
border: border.all(color: colors.black, width: 5),
),child: text("我是custompaint的child"),
),),
繪製部分的實現由custompainter完成。首先建立乙個繼承custompainter的類物件。
class demopainter extends custompainter
@override
bool shouldrepaint(custompainter olddelegate)
}
1度 = pi / 180,所以起始度數 = 度數 * pi / 180。
drawarc方法0度位置是在圓點水平位置左側正方向是順時針,所以圓弧繪製第乙個起始度數引數為-240度(-240 * (pi / 180)),已知0度位置並知道360度位置。-240度位置距離圓點垂直位置下方度數為30,缺口總共度數為60。因此第二個度數引數為 300 * (pi / 180)。
繪製圓弧使用drawarc方法,設定繪製圓形尺寸(圓心,半徑)、起始角度、圓弧角度、是否閉合。
@override
void paint(canvas canvas, size size)
另外custompainter還有child,可以通過stack將文字內容通過text居中顯示,當然ui中間文字和按鈕當然也可以用畫布繪製的方式實現,完整畫布**如下:
demopainter(
painter: canvaspainter(),
foregroundpainter: foregroundpainter(),
child: container(
height: 50,
decoration: boxdecoration(
border: border.all(color: colors.black, width: 5),
),child: stack(
children: [
text("我是custompaint的child"),
center(
child: text(
"96",
style: textstyle(
color: colors.white,
fontsize: 30,
fontweight: fontweight.bold,
),),)],
),),
),
這只是比較簡單的畫布應用,可以用畫布繪製、根據數學公式繪製更多圖形、文字和其他絢麗自定義樣式。canvas在不管是在前端、客戶端都是會有類似的使用場景,而且接觸多了之後會發現每個語言上封裝的介面和方法都很相似,因為在做android開發的時候也接觸過確實是大同小異,所以畫布其他具體功能不再展開。
最後的最後介紹兩個優秀的flutter圖表開源庫syncfusion flutter charts、flutter charting 。你會驚喜的發現通過畫布實現圖表功能原來可以這麼酷炫。
Flutter自定義字型
作業系統所帶的字型往往不能滿足應用場景的需要,這時候就需要使用特殊字型處理。自定義字型步驟如下 步驟1 在工程下新建乙個fonts資料夾,並放乙個字型檔案,如 z24 zihunshoushu.ttf。步驟2 開啟工程根目錄下的工程配置檔案 pubspec.yaml 步驟3 修改工程配置檔案,新增自...
Powershell 自定義物件小技巧
豆子之前在指令碼裡面自定義物件的時候一般是這麼考慮的,我需要建立乙個陣列,每次迴圈的時候把乙個自定義的物件放進去,對於這個自定義的物件的結構,我需要建立乙個雜湊表,然後轉換成自定義物件。這個思路是沒錯,不過具體寫的時候有些小技巧。比如說最近看的乙個小挑戰,其中需要把下面這個 list的值自定義乙個物...
SQL自定義排序小技巧
凡使用過excel的讀者,都知道excel有個自定義排序功能 那麼在sql中是否可以實現類似的自定義排序功能哪?答案是肯定的,這裡,筆者使用的是case when 排序法。實驗如下 測試環境為mysql 要求 根據指定城市名稱排序 1.按照整個字段排序法 即按照城市名稱 name欄位預設排序 sel...