最新項(xiàng)目當(dāng)中使用到了MPAndroidChart這個(gè)三方庫用來繪制相關(guān)的圖標(biāo).該庫能力確實(shí)十分強(qiáng)大,但是使用過程中缺遇到了很多坑,該庫在3.0版本進(jìn)行了一次較大的改動(dòng),相對(duì)于2.x的版本很多用法都發(fā)生了變化.本人使用的是3.03版本,所以內(nèi)容以3.03版本的API為準(zhǔn).項(xiàng)目當(dāng)中主要使用到了折線圖,蠟燭圖,餅狀圖以及組合圖,會(huì)針對(duì)這幾個(gè)圖表進(jìn)行一些整理.
首先po一下MPAndroidChart的Git地址 :?MPAndroidChart,以及對(duì)用的JavaDocs文檔 :?MPAndroidChartJavaDocs
通過JavaDocs可以大致看出來該庫主要分為幾大類:
1,Chart:圖表的基類,其子類則是我們?cè)趚ml當(dāng)中需要用到的各種線段圖控件.例如LineChart(折線圖),BarChart(柱狀圖),CandleChart(蠟燭圖),CombinedChart(組合圖)....
2,ChartData:圖表數(shù)據(jù)的基類,其子類與Chart類的子類一一對(duì)應(yīng),為圖表提供數(shù)據(jù).例如LineData與LineChart對(duì)應(yīng),BarData與BarChart對(duì)應(yīng),CandleChart與CandleData對(duì)應(yīng).用來添加DataSet.
3,BaseDataSet:圖表數(shù)據(jù)設(shè)置的基類.其子類與上述的規(guī)則雷同,例如LineDataSet.用來添加Entry,并且可以對(duì)該圖表中的數(shù)據(jù)進(jìn)行一系列的設(shè)置.
4,BaseEntry:其子類是真正用來添加數(shù)據(jù)的類.規(guī)則也與之前的類似.唯一不同的是折線圖的Entry直接使用Entry.不同的圖標(biāo)Entry需要添加的參數(shù)不同
通過這4個(gè)類,我們得出一個(gè)最基本的信息,不考慮其他效果,交互,僅僅使用最基本的展示圖表的時(shí)候,其用法如下(偽代碼):
折線圖為例:
ArrayList<Entry> lineEntries = new ArrayList<>();
//這里需要特殊說明,3.0版本的用法與2.x版本較大的不同在這里,2.x版本需要單獨(dú)定義一個(gè)存放x坐標(biāo)的集合,而3.0版本只要直接傳入即可
lineEntries.add(new Entry(x坐標(biāo)點(diǎn),實(shí)際的數(shù)據(jù)));? ? ??
LineDataSet lineDataSet = new LineDataSet(lineEntries,"line")? ? //第二個(gè)參數(shù)相當(dāng)于該Set的標(biāo)記,自定義
LineData? lineData = new LineData(lineDataSet);
LineChart.setData(lineData);
當(dāng)然,很多時(shí)候我們的需求不僅僅是單純的展示,還需要有一些列的設(shè)置,那么我們還可以從JavaDocs中找到很多的設(shè)置
1,Chart類的一些設(shè)置: 每個(gè)圖表都可以通過相對(duì)應(yīng)的設(shè)置開啟或關(guān)閉一些交互以及顯示,列舉一些常用的
?//是否可以縮放
setScaleEnabled(true);
//是否繪制邊框
setDrawBorders(true);? ? ?
//邊框的寬度
setBorderWith(1);
//邊框的顏色
setBorderColor(#000000);
//是否可以拖動(dòng)
setDragEnabled(true);
//Y軸是否可以縮放
setScaleYEnabled(false);
//是否啟用Y軸自動(dòng)縮放
setAutoScaleMinMaxEnabled(true);
//是否持續(xù)滾動(dòng)
setDragDecelerationEnabled(false);
//是否雙擊縮放
setDoubleTapToZoomEnabled(false)
//沒有加載到數(shù)據(jù)時(shí)文字顯示
setNoDataText(" ")
//沒有加載到數(shù)據(jù)時(shí)文字顏色
setNoDataTextColor(#000000)
還可以通過getDescription()和getLegend()得到描述對(duì)象和圖例對(duì)象的實(shí)例.并且通過Description和Legend自身的API設(shè)置圖表的描述信息和圖例.這個(gè)不再圖表類的API當(dāng)中,之后拿出來單獨(dú)說
2.DateSet類的一些設(shè)置: 每一種圖表的DateSet都有對(duì)于該圖表設(shè)置的特殊API,以下已LineDataSet,CandleDataSet,BarDataSet為例.
通用:
????//是否顯示數(shù)據(jù)集的數(shù)值? ? ? ??
????setDrawValues(false);?
????//設(shè)置高亮線的顏色,就是點(diǎn)擊或者長按出現(xiàn)的線? ? ? ??
????setHighLightColor(#FFFFFF);??
????//是否允許高亮線顯示
????setHighlightEnabled(false);
LIneDataSet :
? ? //設(shè)置折線圖折線的寬度
? ? setLineWidth();
? ? //設(shè)置折線的樣式? ??CUBIC_BEZIER:圓滑的直線,LINEAR:直線,HORIZONTAL_BEZIER:不是特別圓滑的直線,STEPPED:類似于柱狀圖的感覺? ?
????setMode(LineDAtaSet.Mode.CUBIC_BEZIER);
? ?//是否繪制兩個(gè)點(diǎn)之間的圓點(diǎn)
? ??setDrawCircles(false);
? ? //線的顏色
? ??setColor(#FFFFFF);
? ? //是否填充數(shù)據(jù)集
? ??setDrawFilled(true);
? ? //設(shè)置填充的樣式,可以自己通過shape去畫一個(gè)
? ??setFillDrawable(drawable);
CandleDataSet:
? ? //設(shè)置open < close 的顏色. 也就是跌的顏色
? ??setDecreasingColor(#FFFFFF);
? ? //設(shè)置open > close的顏色, 也就是漲的顏色
? ??setIncreasingColor(#FFFFFF);
? ? //設(shè)置open == close的顏色. 這個(gè)有個(gè)坑,如果不設(shè)置該蠟燭圖的位置是一片空白的
? ??setNeutralColor(#FFFFFF);
? ? //設(shè)置是否蠟燭圖上下的線于該蠟燭圖漲跌顏色相同
? ??setShadowColorSameAsCandle(true);
? ? //設(shè)置蠟燭圖上下線的寬度
????setShadowWidth();
? ?//設(shè)置漲幅蠟燭圖的樣式(空心,實(shí)心)
? ??setDecreasingPaintStyle(Paint.Style.FILL);
? ? //設(shè)置跌幅蠟燭圖的樣式(空心,實(shí)心)? ??
? ???setIncreasingPaintStyle(Paint.Style.FILL);
? ? //設(shè)置數(shù)據(jù)集繪制對(duì)
? ??setAxisDependency(YAxis.AxisDependency.LEFT)
BarDataSet:? ??
? ? //設(shè)置柱狀圖數(shù)據(jù)集的顏色
? ??setColors(ArrayList);
3.x軸和y軸的一些設(shè)置.CharData類是對(duì)整個(gè)圖表外部以及操作進(jìn)行一些設(shè)置,DataSet類是對(duì)圖表內(nèi)容進(jìn)行一些設(shè)置.那么自然也會(huì)有x軸y軸的設(shè)置.
x軸: x軸設(shè)置是通過Chart.getXAxis() 獲得一個(gè)XAxis的實(shí)例,調(diào)用XAxis的實(shí)例進(jìn)行一些對(duì)于x軸的設(shè)置
//是否允許x軸繪制
setDrawLabels(true);? ? 如果設(shè)置為false,則所有的x軸設(shè)置都不起作用
//是否繪制x軸的軸線
setDrawAxisLine(false);
//是否繪制x軸邊線
setDrawGridLines(false);
//設(shè)置x軸的最小偏移
setAxisMinimum(0.5f);
//設(shè)置x軸字體顏色
setTextColor();
//設(shè)置x軸字體大小
setTextSize()
//設(shè)置x軸的位置
setPosition(XAxis.XAxisPosition.BOTTOM);?
//設(shè)置x軸標(biāo)簽數(shù)量
setLabelCount(5,true);? ? 如果不傳第二個(gè)參數(shù)或者false則位置不會(huì)固定,傳入true則位置固定
y軸: y軸分為左邊和右邊兩個(gè)軸,通過getAxisLeft()和getAxisRight()獲得對(duì)應(yīng)的實(shí)例.基本設(shè)置的api與x軸雷同,舉例幾個(gè)能用上但是與x軸不太一樣的
//這是y軸標(biāo)簽
setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART); 可以傳入兩種參數(shù),INSIDE在圖表內(nèi)部,OUTSIDE在外部
//是否允許最上邊的標(biāo)簽繪制
setDrawTopYLabelEntry();
//自定義y軸標(biāo)簽數(shù)值
setValueFormatter(); 內(nèi)部實(shí)現(xiàn)一個(gè)IAxisValueFormatter接口,可以通過里面對(duì)應(yīng)的value修改標(biāo)簽數(shù)值.比如數(shù)值太小轉(zhuǎn)成科學(xué)計(jì)數(shù)法或者截取到幾位等等
一些基本設(shè)置就暫時(shí)寫到這里,后續(xù)會(huì)記錄一下個(gè)人遇到的一些難點(diǎn)