Flutter 112: 圖解自定義 ACEPieWidget 餅狀圖
小菜準備展示一個簡單的餅狀圖,因需要比較簡單單一,所以小菜準備自己繪製一個;今天小菜只嘗試繪製過程,暫不涉及手勢操作;
ACEPieWidget
小菜對於繪製分為三個步驟:
- 類別選項球;
- 切割繪製餅狀圖;
- 餅狀圖中繪製文字;
1. 類別選項球
對於兩側不同顏色類別選項卡,僅需要簡單設定一下 Container 的 decoration 裝飾器即可,只是方便使用者檢視餅狀圖分類而已;
return Container(
height: 45, width: 45,
margin: EdgeInsets.symmetric(vertical: 2.5, horizontal: 10),
decoration: BoxDecoration(color: _color, borderRadius: BorderRadius.circular((25.0))),
child: Center(child: Text(_text, style: TextStyle(fontSize: 12, color: Colors.white))));
2. 餅狀圖繪製
對於 Canvas 的基本繪製,小菜在之前的部落格中有過簡單介紹;此次小菜也是使用最基本的 drawArc 繪製扇形拼接為一個完整圓形方式;
- 獲取 ListData 總的資料值;
- 遍歷 ListData 根據各個子類別資料比例和旋轉角度進行不同顏色的扇形圖繪製;
- 最終拼接為完整餅狀圖;
注意:在繪製扇形圖時需要注意扇形圖的起始角度和終止角度,需要累加上一次繪製的扇形圖角度;
// 1. 設定畫筆
Paint _paint = Paint()..color = Colors.grey
..strokeWidth = 4.0..style = PaintingStyle.fill;
// 2. 獲取 ListData 總的資料值
_sumData() {
if (_listData != null) {
for (int i = 0; i < _listData.length; i++) {
_sum += _listData[i].values.first;
}
}
}
// 3. 根據各個子類別資料比例和旋轉角度進行不同顏色的扇形圖繪製
if (_listData != null) {
for (int i = 0; i < _listData.length; i++) {
startAngle += sweepAngle;
sweepAngle = _listData[i].values.first * 2 * PI / _sum;
canvas.drawArc(_circle, startAngle, sweepAngle, true,
_paint..color = _subPaint(_listData[i].keys.first));
}
}
}
3. 文字繪製
餅狀圖繪製好之後就是在各自的扇形面積上繪製文字;其中小菜規定,只有扇形圖角度大於等於 30 度的時候才會進行文字繪製,如果扇形圖角度太小繪製顯示效果不佳;
- 文字的初始繪製點預設是以螢幕左上角為座標原點,此時在扇形面內進行繪製時首先需要透過 translate() 平移座標系至餅狀圖圓心;
- 繪製文字的角度要與扇形的角平分線平行,此時透過 rotate() 對座標系進行適當角度的旋轉;
- 小菜無法得知文字佔據座標長度,但是可以透過 Paragraph 獲取文字繪製時所佔據高度,因此在透過 drawParagraph 繪製文字時適當設定文字起始座標,y 軸座標向上平移文字高度的一半;
- 再文字繪製結束之後,將座標系 rotate() 旋轉回正常水平豎直方向,並將起始座標 translate() 平移恢復至螢幕左上角;待下次文字繪製;
// 1. 繪製文筆屬性(顏色,尺寸等)和最大段落寬度
ParagraphBuilder _pb = ParagraphBuilder(ParagraphStyle(
textAlign: TextAlign.left, fontWeight: FontWeight.w600,
fontStyle: FontStyle.normal, fontSize: 14))
..pushStyle(ui.TextStyle(color: Colors.white));
ParagraphConstraints _paragraph = ParagraphConstraints(width: size.width * 0.5);
if (sweepAngle >= PI / 6) {
// 2. 平移座標系
canvas.translate(size.width * 0.5, size.height * 0.5);
// 3. 設定旋轉角度
canvas.rotate(startAngle + sweepAngle * 0.5);
// 4. 文字繪製
Paragraph paragraph = (_pb..addText(_subName)).build()..layout(_paragraph);
canvas.drawParagraph(paragraph, Offset(50.0, 0.0 - paragraph.height * 0.5));
// 5. 恢復旋轉角度
canvas.rotate(-startAngle - sweepAngle * 0.5);
// 6. 恢復起始座標
canvas.translate(-size.width * 0.5, -size.height * 0.5);
}
[ACEPieWidget 案例原始碼] github.com/ACE-YANGCE/FlutterApp/blob/master/lib/page/ace_pie_page.dart
小菜僅簡短的介紹了一下基本餅狀圖的樣式繪製,其功能還不夠完善,後續會加入適當的手勢操作;如有錯誤,請多多指導!
來源: 阿策小和尚
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3244/viewspace-2826983/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 自定義View合輯(2)-餅狀圖View
- Flutter 自定義 Widget 之餅形圖實戰Flutter
- 使用 Flutter 繪製圖表(二)餅狀圖?Flutter
- echarts 餅圖巢狀 二級餅圖 子餅圖 複合餅圖Echarts巢狀
- Android 折線圖之hellocharts (餅狀圖)餅圖Android
- 柱狀圖、直方圖、散點圖、餅圖講解直方圖
- Android自定義View,畫一個好看帶延長線的餅狀圖AndroidView
- Flutter 115: 圖解自定義 View 之 Canvas (四Flutter圖解ViewCanvas
- 永宏BI 自定義繪圖(環狀圖)繪圖
- android 自定義帶動畫的統計餅圖Android動畫
- 餅圖元件的基本使用和自定義調整元件
- Flutter 23: 圖解自定義 Dialog 對話方塊Flutter圖解
- Quart2D 畫圖二 (餅狀圖、柱狀圖)
- SVG繪製餅狀圖SVG
- 【Flutter 專題】104 圖解自定義 ACEDropdownButton 下拉框Flutter圖解
- 自定義檢視---圓角柱狀圖(一)
- Canvas(3)---繪製餅狀圖Canvas
- 小技巧:Flutter如何引用自定義圖示Flutter
- flutter 用 CustomPaint 繪製自定義圖案FlutterAI
- Flutter 自定義列表以及本地圖片引用Flutter地圖
- Android 自定義帶動畫的柱狀圖Android動畫
- D3.js上手——餅狀圖JS
- Flutter自定義折線圖並新增點選事件Flutter事件
- flutter 自定義view 繪製曲線統計圖FlutterView
- CSS3動態餅狀圖效果CSSS3
- 微信小程式echarts-餅狀圖微信小程式Echarts
- 餅圖
- Python自定義詞雲圖形狀和文字顏色Python
- Highcharts+PHP+Mysql生成餅狀統計圖PHPMySql
- 用Python生成柱狀圖、折線圖、餅狀圖來統計自己的手機話費Python
- 餅圖0625
- [-Flutter 自定義元件-] 蛛網圖+繪製+動畫實踐Flutter元件動畫
- python-資料分析-Matplotlib-1-基礎圖形(曲線圖-散點-柱狀-堆疊柱狀-餅狀圖-直方圖)Python直方圖
- 使用 Flutter 繪製圖表(一)柱狀圖?Flutter
- 【Flutter 專題】84 圖解自定義 ACEWave 波浪 Widget (二)|8月更文挑戰Flutter圖解
- 【Flutter 專題】83 圖解自定義 ACEWave 波浪 Widget (一)|8月更文挑戰Flutter圖解
- Flutter 47: 圖解新的狀態管理 Provider (二)Flutter圖解IDE
- hightchart的3d餅狀圖圖例顯示問題記錄3D