Flutter 空心餅狀圖的實現(xiàn)

? ? ? ? 根據(jù)項目需求,需要實現(xiàn)下面的餅狀圖

然后找到了charts_fluttercharts_flutter | Flutter Package這個插件,進來之后可以看到Readme模塊中有一個online gallery

可以看出來是使用這個插件可以實現(xiàn)的各種圖表的樣式,往下拉可以看到在餅狀圖的示例中,正好有上面UI相同的樣式

點進去,就可以看到Example: 的示例代碼

可以看一下PieChart(XXXXX)(XXXXX代表方法中的各種參數(shù),這里就不提出來了)方法,示例中給出了3個參數(shù),分別為seriesList、animate、defaultRenderer。

????????先看seriesList,可以看到是Series的一個集合,而Series在示例代碼中也看到它的實現(xiàn)方法。

Series<LinearSales, int>(

? ? ? ? id: 'Sales',

? ? ? ? domainFn: (LinearSales sales, _) => sales.year,

? ? ? ? measureFn: (LinearSales sales, _) => sales.sales,

? ? ? ? data: data,

? ? ? ? // Set a label accessor to control the text of the arc label.

? ? ? ? labelAccessorFn: (LinearSales row, _) => '${row.year}: ${row.sales}',

? ? ? )

LinearSales是自定義的Object

class LinearSales {

? final int year;

? final int sales;

? LinearSales(this.year, this.sales);

}

方法中的id是可以自己定義的一個String類型的字段,domainFn和measureFn可以認為是一個坐標中的坐標系(在柱狀圖和折線圖中會比較好理解一點),在示例中分別取值為自定義的對象LinearSales 的year、sales兩個字段,data是LinearSales的集合(需要展示的數(shù)據(jù)的集合)。labelAccessorFn這個參數(shù)就是指的“備注”,在示例代碼中賦值為'${row.year}: ${row.sales}',在視圖中展示為下圖,那么是不是也可以在LinearSales中賦值一個參數(shù)來設置這個“備注”?

? ? 再看animate方法,是一個bool類型的值,是否需要動畫。

? ? 最后看defaultRenderer,它是一個ArcRendererConfig,示例代碼中給了兩個參數(shù)arcWidth、arcRendererDecorators。arcWidth這個好理解,就是這個餅圖的寬度(這個寬度可以理解為是畫出來的餅圖的線的寬度),arcRendererDecorators是Series中l(wèi)abelAccessorFn在餅狀圖中的顯示樣式。

? ? ? ?那么問題來了,要實現(xiàn)我們需求要求的樣式的話,需要修改這個餅狀圖的顏色,示例代碼中并沒有給出來,那么就得自己研究了。那么留兩個疑問:餅狀圖不同區(qū)域的不同顏色;展示備注的樣式修改。

? ? ? 1、給餅狀圖設置想要的顏色:

? ? ? ? 我們在這個插件的瀏覽器頁面中返回上一頁(多種不同樣式圖表展示的頁面),可以看到有多個顏色的圖表,點進去,或者在代碼中點擊進入Series的源碼中,都看到了一個colorFn的字段,和設置domainFn和measureFn字段類似,那么我們是不是可以在LinearSales中新賦值一個顏色的參數(shù),來對Series進行設置。

? ? ? ? 2、設置備注“l(fā)abelAccessorFn”的展示樣式

? ? ? ? 在上面的文章中也提到了,arcRendererDecorators參數(shù)賦值的是一個ArcLabelDecorator,這個ArcLabelDecorator就是來做這個“備注”的展示樣式的,我們點進去這個方法

看到了一些默認的參數(shù),labelPosition是一個ArcLabelPosition,而根據(jù)它定義的值來說

我們可以得知它是用來區(qū)分這個“備注”在餅狀圖中的位置。

? ? ? ? 而TextStyleSpec參數(shù)呢,通過它的代碼,是不是就可以知道這個就是用來設置“備注”的樣式的方法

那么現(xiàn)在,用代碼(demo)來確定是不是可以通過上述的方法實現(xiàn)需求想要的結果

? ? 1、首先,創(chuàng)建一個需要展示的數(shù)據(jù)的PieSales?(示例代碼中的LinearSales),我們把顏色和自定義的“備注”字段都加上

import 'package:charts_flutter/flutter.dart' as charts;

class PieSales {

? ? ?final intstatus;

? ? ?final StringstatusInfo;

? ????final intsales;

? ????final charts.Colorcolor;

? ????PieSales(this.status, this.sales, this.color, this.statusInfo);

}

????????2、然后,生成PieSales 的集合data

var data = [

????PieSales(0,20,charts.ColorUtil.fromDartColor(Color(0xFF48BFFE)), "Zero",),

? ? PieSales(1,20,charts.ColorUtil.fromDartColor(Color(0xFF38D28D)),"One",),

? ? PieSales(2,20,charts.ColorUtil.fromDartColor(Color(0xFFF2CE28)), "Two", ),

? ? PieSales(3,20,charts.ColorUtil.fromDartColor(Color(0xFFFFA65B)), "Three",),

? ? PieSales(4,20, charts.ColorUtil.fromDartColor(Color(0xFFE5574D)), "Four",),

? ? PieSales(5, 20,charts.ColorUtil.fromDartColor(Color(0xFFDADADA)), "Five",),

];

? ? ? ? 3、再然后,生成Series的集合seriesList

var seriesList = [

????charts.Series(

????????id:'Sales',

? ? ????domainFn: (PieSales sales, _) => sales.status,

? ? ????measureFn: (PieSales sales, _) => sales.sales,

? ? ????colorFn: (PieSales sales, _) => sales.color,

? ? ????data: data,

? ????? labelAccessorFn: (PieSales row, _) => row.statusInfo,

? ?)

];

? ? ? ? 4、最后,return 出來一個PieChart

return charts.PieChart(

????seriesList,

? animate:true,

? defaultRenderer:new charts.ArcRendererConfig(

????????arcWidth: (ScreenUtil().scaleWidth *40).toInt(),

? ? ? ????arcRendererDecorators: [

????????????????charts.ArcLabelDecorator(

????????????????????labelPosition: charts.ArcLabelPosition.inside,

? ? ? ? ? ? ? ? insideLabelStyleSpec:

????????????????????charts.TextStyleSpec(fontSize:8, color: charts.Color.white),

? ? ? ? )

????]),

);

效果圖,如下圖

我們修改labelPosition和insideLabelStyleSpec兩個參數(shù),看下效果

labelPosition: charts.ArcLabelPosition.auto,

insideLabelStyleSpec:charts.TextStyleSpec(fontSize:12, color: charts.Color.black),

效果如下

我們把其中一個“Four”修改為“FourFourFourFourFourFour”,展示如下圖:

再修改labelPosition

labelPosition: charts.ArcLabelPosition.outside,

如圖

至此,這個空心餅狀圖是不是就完成了。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容