在第一步,須要將依賴的庫添加到你的項目中android
想要使用 LineChart,BarChart,ScatterChart,CandleStickChart,PieChart,BubbleChart或者RadarChart,須要先在xml中定義git
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/chart"
android:layout_width="match_parent"
android:layout_height="match_parent" />
複製代碼
而後在你的Activity或者Fragment中獲取控件github
LineChart chart = (LineChart) findViewById(R.id.chart);
複製代碼
或者使用代碼建立,在佈局中添加canvas
LineChart chart = new LineChart(Context);
RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout);
rl.add(chart);
複製代碼
在你擁有了圖表的實例以後,你能夠建立數據並添加到圖表中.下面是一個使用折線圖的例子,每一條數據均可以使用Entry這個類來標識x,y座標. 在其餘圖表類型中,好比BarChart使用其餘的類(好比BarEntry)來達到相同的目的.數組
添加數據到圖表中,須要將全部的數據都包裹在Entry對象中bash
YourData[] dataObjects = ...;
List<Entry> entries = new ArrayList<Entry>();
for (YourData data : dataObjects) {
entries.add(new Entry(data.getValueX(), data.getValueY()));
}
複製代碼
而後,你須要給你建立的LineDataSet對象添加List數據集合,DataSet對象持有數據,這些數據用戶能夠自定義樣式. 下面的"Label"用於描述數據的做用,若是圖例開啓的話,還會做爲圖例顯示在圖表上網絡
LineDataSet dataSet = new LineDataSet(entries, "Label"); // 添加數據
dataSet.setColor(...);
dataSet.setValueTextColor(...); // 自定義數據樣式
複製代碼
最後一步,你須要把建立好的LineDataSet添加到LineData中,添加完數據,利用Chart的實例去設置數據,而且刷新一下app
LineData lineData = new LineData(dataSet);
chart.setData(lineData);
chart.invalidate(); // 刷新
複製代碼
這個庫可讓你最大限度的經過手勢觸摸與圖表交互,而且經過回調函數獲取反饋ide
若是使用手勢操做圖表,可使用OnChartGestureListener來監聽回調函數
public interface OnChartGestureListener {
//當手指剛觸摸到圖表時觸發,action_down
void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture);
//當手指在圖表上操做結束時調用,action_up、action_cancel
void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture);
//長按圖表回調
public void onChartLongPressed(MotionEvent me);
//雙擊圖表回調
public void onChartDoubleTapped(MotionEvent me);
//單擊圖表回調
public void onChartSingleTapped(MotionEvent me);
//滑動圖表回調
public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY);
//縮放圖表回調
public void onChartScale(MotionEvent me, float scaleX, float scaleY);
//拖拽圖表回調
public void onChartTranslate(MotionEvent me, float dX, float dY);
}
複製代碼
將你的Chart去設置手勢監聽器就能夠實現這些回調
chart.setOnChartGestureListener(this);
複製代碼
高亮樣式能夠由我的自定義
dataSet.setHighlightEnabled(true); // 是否容許高亮
dataSet.setDrawHighlightIndicators(true); // 設置是否有拖拽高亮指示器
dataSet.setHighlightColor(Color.BLACK); // 設置高亮顏色
複製代碼
OnChartValueSelectedListener,經過觸摸高亮數據時的回調
public interface OnChartValueSelectedListener {
//當圖表內的一項被選中時的回調
public void onValueSelected(Entry e, Highlight h);
//當沒有選擇項時的回調
public void onNothingSelected();
}
複製代碼
Highlight類,一般被用於獲取高亮條目的信息,或者用來給圖表或者Entry對提供數據用於高亮,Highlight類提供兩個構造函數
//標準的Highlight構造函數
public Highlight(float x, int dataSetIndex) { ... }
//給BarEntry使用的Highlight構造函數
public Highlight(float x, int dataSetIndex, int stackIndex) { ... }
複製代碼
一個經過代碼方式利用Highlight進行高亮的例子
// highlight the entry and x-position 50 in the first (0) DataSet
Highlight highlight = new Highlight(50f, 0);
chart.highlightValue(highlight, false); // highlight this value, don't call listener 複製代碼
全部用戶輸入的手勢高亮形式都是由默認的ChartHighlighter類完成的,經過自定義ChartHighlighter類的實現來替換默認的,完成更多的不一樣的高亮形式 setHighlighter(ChartHighlighter highlighter): 傳入自定義的ChartHighlighter實現類對象來完成高亮樣式的設置
座標軸類經過如下部分實現具體的樣式
可使用IAxisValueFormatter接口來格式化座標軸數據,使用axis.setValueFormatter(IAxisValueFormatter formatter)設置本身的定製數據格式
像邊界線和約束線這種用於表示特殊信息的線咱們稱之爲限制線,限制線在Y軸上橫向呈現,在X軸上縱向呈現
限制線顧名思義是給用戶提供格外信息的一種簡潔、簡單的線
例如,您的圖表可能會顯示用戶的各類血壓測量結果.爲了通知用戶,收縮壓超過140毫米汞柱被認爲是健康風險,你能夠在140添加一個限制線來提供這些信息
YAxis leftAxis = chart.getAxisLeft();
LimitLine ll = new LimitLine(140f, "健康的血壓線");
ll.setLineColor(Color.RED);
ll.setLineWidth(4f);
ll.setTextColor(Color.BLACK);
ll.setTextSize(12f);
// .. 更多的樣式設置
leftAxis.addLimitLine(ll);
複製代碼
任何與橫軸有關的數據信息都存放在X軸中,像折線圖、柱狀圖、網狀圖、蠟燭圖、雷達圖等都有XAxis對象
獲取X軸實例對象使用
XAxis xAxis = chart.getXAxis();
複製代碼
示例代碼
XAxis xAxis = chart.getXAxis();
xAxis.setPosition(XAxisPosition.BOTTOM);
xAxis.setTextSize(10f);
xAxis.setTextColor(Color.RED);
xAxis.setDrawAxisLine(true);
xAxis.setDrawGridLines(false);
// 設置定製的數據格式
xAxis.setValueFormatter(new MyCustomFormatter());
複製代碼
任何與縱軸有關的數據信息都存放在Y軸中,像折線圖、柱狀圖、網狀圖、蠟燭圖等都有左右兩個YAxis對象,雷達圖只有一個YAxis對象
獲取YAxis實例對象
YAxis leftAxis = chart.getAxisLeft();
YAxis rightAxis = chart.getAxisRight();
YAxis leftAxis = chart.getAxis(AxisDependency.LEFT);
YAxis yAxis = radarChart.getYAxis(); // 雷達圖獲取YAxis方法
複製代碼
在運行時,可使用public AxisDependency getAxisDependency()來肯定YAxis是圖表的哪一邊的 想要設置效果必須在給圖表設置數據以前
默認狀況下,全部添加到圖表的數據都和左邊的Y軸數據相對應,沒有進一步設置的狀況下右邊的Y軸數據以及樣式比例均與左邊統一,若是你想要設置不一樣比例的Y軸,你能夠經過設置對應的數據來繪製對應的座標軸實現
LineDataSet dataSet = ...; // 獲取dataset
dataSet.setAxisDependency(AxisDependency.RIGHT);
複製代碼
除了網格線與YAxis上的每一個值水平並排,還有所謂的零線,它在軸上的零(0)值處繪製,相似於網格線,但能夠單獨配置。
零線代碼示例:
// 數據設置在左邊座標軸
YAxis left = mChart.getAxisLeft();
left.setDrawLabels(false); // 不設置座標軸數據標籤
left.setDrawAxisLine(false); // 不繪製座標軸線
left.setDrawGridLines(false); // 不繪製網格線
left.setDrawZeroLine(true); // 繪製零線
mChart.getAxisRight().setEnabled(false); // 不設置右邊Y軸
複製代碼
更多的代碼示例:
YAxis yAxis = mChart.getAxisLeft();
yAxis.setTypeface(...); // 設置一個不一樣的字體
yAxis.setTextSize(12f); // 設置字體大小
yAxis.setAxisMinimum(0f); // 設置座標軸從0開始
yAxis.setAxisMaximum(100f); // 設置座標軸最大值爲100
yAxis.setTextColor(Color.BLACK); // 設置字體顏色爲黑色
yAxis.setValueFormatter(new MyValueFormatter());
yAxis.setGranularity(1f); // 設置間隔爲1
yAxis.setLabelCount(6, true); // 設置標籤個數
//... 更多
複製代碼
若是想要給圖表添加數據須要使用如下方式:
public void setData(ChartData data) { ... }
複製代碼
基類CharData包含在渲染時圖表所須要的全部的數據和信息 對於每一種數據圖表,都有一個CharData的子類用於給圖表設置數據
在構造函數中,可使用List<? extends IDataSet>做爲數據去顯示,
兩種不一樣的構造函數
/** List constructor */
public LineData(List<ILineDataSet> sets) { ... }
/** Constructor with one or multiple ILineDataSet objects */
public LineData(ILineDataSet...) { ... }
複製代碼
一個DataSet對象表明一組圖表中一塊兒的數據,這樣能夠在邏輯上分離圖表上的不一樣組數據. 對於每種類型的圖表,存在容許特定樣式的擴展DataSet的不一樣對象(例如Line DataSet)
舉個例子,若是你想要顯示兩家不一樣公司上一年季度性的財政收入,推薦使用兩個LineDataSet,每個中包含四組數據 那麼如何去設置LineDataSet對象呢
public LineDataSet(List<Entry> entries,String label){...}
複製代碼
能夠看到,LineDataSet的構造函數中須要List一系列的數據以及用於描述數據信息的label, 此label還能夠進一步在LineData中去找到對應的LineDataSet對象 這些Entry的列表中包含了圖表的全部數據,而Entry類就至關於X、Y座標值的一個包裝類,用於存放一個具體的座標值
public Entry(float x, float y) { ... }
複製代碼
上面的例子,咱們第一步能夠建立一個用於存放公司收入的Entry的集合
List<Entry> valsComp1 = new ArrayList<Entry>();
List<Entry> valsComp2 = new ArrayList<Entry>();
複製代碼
而後填充數據,確保Entry內的X軸數據是精確的
Entry c1e1 = new Entry(0f, 100000f); // 一公司第一季度數據
valsComp1.add(c1e1);
Entry c1e2 = new Entry(1f, 140000f); // 一公司第二季度數據
valsComp1.add(c1e2);
// 繼續添加
Entry c2e1 = new Entry(0f, 130000f); // 二公司第一季度數據
valsComp2.add(c2e1);
Entry c2e2 = new Entry(1f, 115000f); // 二公司第二季度數據
valsComp2.add(c2e2);
//...
複製代碼
如今咱們能夠經過這一系列數據去建立LineDataSet對象
LineDataSet setComp1 = new LineDataSet(valsComp1, "Company 1");
setComp1.setAxisDependency(AxisDependency.LEFT);
LineDataSet setComp2 = new LineDataSet(valsComp2, "Company 2");
setComp2.setAxisDependency(AxisDependency.LEFT);
複製代碼
經過使用setAxisDependency來指定具體數據繪製的軸,而後經過建立IDataSets的List來構成ChartData對象
// 使用ILineDataSet接口
List<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
dataSets.add(setComp1);
dataSets.add(setComp2);
LineData data = new LineData(dataSets);
mLineChart.setData(data);
mLineChart.invalidate(); // 刷新
複製代碼
在調用invalidate方法刷新後,數據就會被繪製出來
若是咱們想特別定製X軸數據來替換原先的0到3,咱們可使用IAxisValueFormatter接口 這個接口可讓咱們自定義X軸數據顯示樣式 舉個例子,像如下這樣設置數據格式:
// 繪製在X軸上的數據數組
final String[] quarters = new String[] { "Q1", "Q2", "Q3", "Q4" };
IAxisValueFormatter formatter = new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return quarters[(int) value];
}
@Override
public int getDecimalDigits() { return 0; }
};
XAxis xAxis = mLineChart.getXAxis();
xAxis.setGranularity(1f); // 最小的間隔設置爲1
xAxis.setValueFormatter(formatter);
複製代碼
最後渲染的圖表的樣子
BarChart,ScatterChart,BubbleChart和CandleStickChart的設置數據與LineChart同樣 其中特殊的是BarChart將會在下面進行解釋:
若是List沒有正確的X軸排列順序,可能致使一些意外的狀況 咱們可使用EntryXComparator來進行排序
List<Entry> entries = ...;
Collections.sort(entries, new EntryXComparator());
複製代碼
柱狀圖的設置數據方式與折線圖相似,最大的不一樣在於柱狀圖存放數據的BarEntry有一些不一樣的樣式設置
建立BarDataSet
List<BarEntry> entries = new ArrayList<>();
entries.add(new BarEntry(0f, 30f));
entries.add(new BarEntry(1f, 80f));
entries.add(new BarEntry(2f, 60f));
entries.add(new BarEntry(3f, 50f));
// 跳過第五個
entries.add(new BarEntry(5f, 70f));
entries.add(new BarEntry(6f, 60f));
BarDataSet set = new BarDataSet(entries, "BarDataSet");
複製代碼
將數據設置到圖表上
BarData data = new BarData(set);
data.setBarWidth(0.9f); // 設置數據條的寬度
chart.setData(data);
chart.setFitBars(true); // 讓X軸與全部的數據條適配
chart.invalidate(); // 刷新
複製代碼
當柱狀圖被建立時,每個條都有1f的寬度,設置爲0.9f的寬度後,將會在兩個條各存在0.1f的間隔 設置setFitBars(true)將會讓X軸的範圍很好的適配柱狀圖,而不會出現有哪一個條被邊緣線切斷
刷新後顯示:
YourData[] group1 = ...;
YourData[] group2 = ...;
List<BarEntry> entriesGroup1 = new ArrayList<>();
List<BarEntry> entriesGroup2 = new ArrayList<>();
// 填充數據
for(int i = 0; i < group1.length; i++) {
entriesGroup1.add(new BarEntry(i, group1.getValue()));
entriesGroup2.add(new BarEntry(i, group2.getValue()));
}
//兩組數據
BarDataSet set1 = new BarDataSet(entriesGroup1, "Group 1");
BarDataSet set2 = new BarDataSet(entriesGroup2, "Group 2");
複製代碼
這樣就獲取到兩組數據,如今用這兩組數據去完成羣組柱狀圖
float groupSpace = 0.06f; //羣組間的間隔
float barSpace = 0.02f; // 每個柱狀條間隔
float barWidth = 0.45f; // 每個柱狀條的寬度
// (0.02 + 0.45) * 2 + 0.06 = 1.00 -> 總共合起來仍是1f
BarData data = new BarData(set1, set2); //設置組數據
data.setBarWidth(barWidth); // 設置柱狀條寬度
barChart.setData(data);
barChart.groupBars(1980f, groupSpace, barSpace); // 設置組樣式寬度等
barChart.invalidate(); // 刷新
複製代碼
groupBars(...)對羣組數據進行了具體的設置,這個方法的具體參數
public void groupBars(float fromX, float groupSpace, float barSpace) { ... }
複製代碼
fromX標識X軸數據從哪邊開始進行渲染
最後渲染出來爲:
經過使用setCenterAxisLabels(...)方法可讓標籤數據正確顯示在羣組柱狀條中間
XAxis xAxis = chart.getXAxis();
xAxis.setCenterAxisLabels(true);
複製代碼
設置與普通的柱狀圖相似,不一樣的是BarEntry的構造函數使用
public BarEntry(float x, float [] yValues) { ... }
複製代碼
第二個參數是一個疊加的數據值數組
BarEntry stackedEntry = new BarEntry(0f, new float[] { 10, 20, 30 });
複製代碼
這樣在圖表上顯示高度爲10,20,30的三段數據
不一樣於其餘的圖形,餅圖的構造函數是這樣的:
public PieEntry(float value, String label) { ... }
複製代碼
第一個參數便是當前所佔區域的大小數據,第二個參數用於描述當前區域的信息
完整的餅圖的建立
List<PieEntry> entries = new ArrayList<>();
entries.add(new PieEntry(18.5f, "Green"));
entries.add(new PieEntry(26.7f, "Yellow"));
entries.add(new PieEntry(24.0f, "Red"));
entries.add(new PieEntry(30.8f, "Blue"));
PieDataSet set = new PieDataSet(entries, "Election Results");
PieData data = new PieData(set);
pieChart.setData(data);
pieChart.invalidate(); // 刷新
複製代碼
餅圖沒有X軸,數據的顯示順序由添加順序來定義 渲染完成後:
在這個小例子中咱們有兩組數據用於表明兩個公司季度收入,咱們想要設置不一樣的顏色去區分它們 咱們想要:
LineDataSet setComp1 = new LineDataSet(valsComp1, "Company 1");
setComp1.setColors(new int[] { R.color.red1, R.color.red2, R.color.red3, R.color.red4 }, Context);
LineDataSet setComp2 = new LineDataSet(valsComp2, "Company 2");
setComp2.setColors(new int[] { R.color.green1, R.color.green2, R.color.green3, R.color.green4 }, Context);
複製代碼
給DataSet設置顏色的方法
固然也可使用顏色模板
LineDataSet set = new LineDataSet(...);
set.setColors(ColorTemplate.VORDIPLOM_COLORS);
複製代碼
在沒有設置顏色的時候,將會使用默認的顏色
IValueFormatter接口用於建立自定義格式類來在圖表繪製以前格式數據 使用IValueFormatter,簡單的建立一個類去實現這個接口,並返回你從getFormattedValue(...)方法獲取的數據想要顯示的樣子
public class MyValueFormatter implements IValueFormatter {
private DecimalFormat mFormat;
public MyValueFormatter() {
mFormat = new DecimalFormat("###,###,##0.0"); // 使用金融類型的格式
}
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
// 寫下你的代碼邏輯
return mFormat.format(value) + " $"; // 好比在數據前添加一個$符
}
}
複製代碼
給ChartData或者DataSet添加格式化
// 圖表內的數據均使用這種格式
lineData.setValueFormatter(new MyValueFormatter());
// 僅在該DataSet內使用這種格式
lineDataSet.setValueFormatter(new MyValueFormatter());
複製代碼
建立一個類實現IAxisValueFormatter接口,用於格式化座標軸上的值
public class MyYAxisValueFormatter implements IAxisValueFormatter {
private DecimalFormat mFormat;
public MyAxisValueFormatter() {
//格式化數字
mFormat = new DecimalFormat("###,###,##0.0");
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
// value參數標識在座標軸上的位置或者說是數據值,axis標識是哪一個座標軸
return mFormat.format(value) + " $";
}
/** 只有爲數字時返回 其他返回0*/
@Override
public int getDecimalDigits() { return 1; }
}
複製代碼
下面的例子展現怎麼把數組中的數據展現到座標軸上去
public class MyXAxisValueFormatter implements IAxisValueFormatter {
private String[] mValues;
public MyXAxisValueFormatter(String[] values) {
this.mValues = values;
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
return mValues[(int) value];
}
@Override
public int getDecimalDigits() { return 0; }
}
複製代碼
在建立好格式化類以後,簡單去運用它
YAxis left = chart.getAxisLeft();
left.setValueFormatter(new MyYAxisValueFormatter());
String[] values = new String[] { ... };
XAxis xAxis = chart.getXAxis();
xAxis.setValueFormatter(new MyXAxisValueFormatter(values));
複製代碼
設置完以後,圖表用格式化類來具體指定值來代替默認的座標軸的最小值和最大值範圍
若是使用上面的數組格式化座標軸標籤值,可使用一下的代碼去限制標籤間的間隔
axis.setGranularity(1f);
複製代碼
這將能夠預防座標軸繪製重疊的數據,由於在縮放到必定的程度時,圖表將會中止計算更小的標籤範圍
下面是一些能夠直接在Chart上使用的樣式設置方法
圖例一般有一個標識和一字符串組成,標識爲表明該數據的DataSet的顏色決定,字符串是DataSet的描述
Legend legend = chart.getLegend();
複製代碼
例子
Legend l = chart.getLegend();
l.setFormSize(10f);
l.setForm(LegendForm.CIRCLE);
l.setPosition(LegendPosition.BELOW_CHART_LEFT);
l.setTypeface(...);
l.setTextSize(12f);
l.setTextColor(Color.BLACK);
l.setXEntrySpace(5f);
l.setYEntrySpace(5f);
l.setCustom(ColorTemplate.VORDIPLOM_COLORS, new String[] { "Set1", "Set2", "Set3", "Set4", "Set5" });
// and many more...
複製代碼
MPAndroidChart並不支持實時數據,可是爲了向圖表添加新數據或動態刪除數據,有各類方法能夠將Entry對象添加到已有的DataSet對象或從已有的ChartData對象中刪除DataSet對象
Class DataSet(以及全部子類):
Class ChartData(以及全部子類):
一樣也有刪除數據的方法
Class DataSet(以及全部子類):
Class ChartData(以及全部子類):
在動態刪除或者添加數據以後,必定要在調用invalidate()刷新頁面以前調用notifyDataSetChanged()方法更新數據
// EXAMPLE 1
// add entries to the "data" object
exampleData.addEntry(...);
chart.notifyDataSetChanged(); // 讓Chart知道數據發生變化
chart.invalidate(); // 刷新
// EXAMPLE 2
// add entries to "dataSet" object
dataSet.addEntry(...);
exampleData.notifyDataChanged(); // 讓DataSet知道數據發生變化
chart.notifyDataSetChanged(); // 讓Chart知道數據發生變化
chart.invalidate(); // 刷新
複製代碼
這些方法只適用於LineChart,BarChart,ScatterChart和CandleStickChart
全部的moveViewTo相似的方法都會自動調用invalidate方法去刷新頁面,不須要手動去調用
例子:
chart.setData(...);
// 開始設置視窗
chart.setVisibleXRangeMaximum(20);
chart.moveViewToX(10);
複製代碼
全部的圖表都提供了動畫以供操做使用
有三種不一樣的動畫存在
mChart.animateX(3000); // animate horizontal 3000 milliseconds
mChart.animateY(3000); // animate vertical 3000 milliseconds
mChart.animateXY(3000, 3000); // animate horizontal and vertical 3000 milliseconds
複製代碼
你能夠從Easing.EasingOption中選擇想要的預置平緩動畫效果
public enum EasingOption {
Linear,
EaseInQuad,
EaseOutQuad,
EaseInOutQuad,
EaseInCubic,
EaseOutCubic,
EaseInOutCubic,
EaseInQuart,
EaseOutQuart,
EaseInOutQuart,
EaseInSine,
EaseOutSine,
EaseInOutSine,
EaseInExpo,
EaseOutExpo,
EaseInOutExpo,
EaseInCirc,
EaseOutCirc,
EaseInOutCirc,
EaseInElastic,
EaseOutElastic,
EaseInOutElastic,
EaseInBack,
EaseOutBack,
EaseInOutBack,
EaseInBounce,
EaseOutBounce,
EaseInOutBounce,
}
複製代碼
public void animateY(int durationmillis, Easing.EasingOption option);
複製代碼
例如調用時就將動畫效果設置進去
mChart.animateY(3000, Easing.EasingOption.EaseOutBack);
複製代碼
public void animateY(int durationmillis, EasingFunction function);
複製代碼
建立一個類去實現EasingFunction接口,在該類中實現本身的邏輯
/**
* Interface for creating custom made easing functions.
*/
public interface EasingFunction {
/**
* Called everytime the animation is updated.
* @param input - the time passed since the animation started (value between 0 and 1)
*/
public float getInterpolation(float input);
}
複製代碼
調用的時候(在Android3.0如下的版本中將會Crash掉)
mChart.animateY(3000, new MyEasingFunction());
複製代碼
IMarker接口是你可以在建立自定義的標註樣式去顯示你圖表中高亮的數據 IMarker定義的像這樣:
public interface IMarker {
/**
* @return The desired (general) offset you wish the IMarker to have on the x- and y-axis.
* By returning x: -(width / 2) you will center the IMarker horizontally.
* By returning y: -(height / 2) you will center the IMarker vertically.
*/
MPPointF getOffset();
/**
* @return The offset for drawing at the specific `point`. This allows conditional adjusting of the Marker position.
* If you have no adjustments to make, return getOffset().
*
* @param posX This is the X position at which the marker wants to be drawn.
* You can adjust the offset conditionally based on this argument.
* @param posY This is the X position at which the marker wants to be drawn.
* You can adjust the offset conditionally based on this argument.
*/
MPPointF getOffsetForDrawingAtPos(float posX, float posY);
/**
* 刷新方法
*
* @param e The Entry the IMarker belongs to. This can also be any subclass of Entry, like BarEntry or
* CandleEntry, simply cast it at runtime.
* @param highlight The highlight object contains information about the highlighted value such as it's dataset-index, the * selected range or stack-index (only stacked bar entries). */ void refreshContent(Entry e, Highlight highlight); /** * 使用傳遞來的Canvas對象在指定位置繪製對應的標註 * * @param canvas * @param posX * @param posY */ void draw(Canvas canvas, float posX, float posY); } 複製代碼
你須要建立一個類去實現IMarker接口
public class YourMarkerView implements IMarker { ... }
複製代碼
根據你本身的須要去實現你所要實現的方法
下面例子的這種方法更簡單,不須要實現IMarker接口提供的全部方法 只有特定的方法能夠被覆蓋和定製,最重要的是重寫refreshContent方法來調整由標記繪製的數據
public class YourMarkerView extends MarkerView {
private TextView tvContent;
public MyMarkerView(Context context, int layoutResource) {
super(context, layoutResource);
// find your layout components
tvContent = (TextView) findViewById(R.id.tvContent);
}
// callbacks everytime the MarkerView is redrawn, can be used to update the
// content (user-interface)
@Override
public void refreshContent(Entry e, Highlight highlight) {
tvContent.setText("" + e.getY());
// this will perform necessary layouting
super.refreshContent(e, highlight);
}
private MPPointF mOffset;
@Override
public MPPointF getOffset() {
if(mOffset == null) {
// center the marker horizontally and vertically
mOffset = new MPPointF(-(getWidth() / 2), -getHeight());
}
return mOffset;
}
}
複製代碼
想要在圖表中使用你設置好的marker,使用setMarker方法
IMarker marker = new YourMarkerView();
chart.setMarker(marker);
複製代碼
獲取一個已經存在的marker,使用getMarker()方法
IMarker marker = chart.getMarker();
複製代碼
ChartData類是全部圖表數據類的基類
public class LineData extends ChartData { ...
複製代碼
下面的是已經被實現且在子類中可使用的方法
BarData
ScatterData
PieData
BubbleData
DataSet數據類用法與ChartData幾乎如出一轍
Line-, Bar-, Scatter-, Bubble- & CandleDataSet
Line-, Bar-, Scatter-, Candle- & RadarDataSet
Line- & RadarDataSet
LineDataSet
BarDataSet
ScatterDataSet
CandleDataSet
BubbleDataSet
PieDataSet
經過如下方式來獲取視窗Handler實例
ViewPortHandler handler = chart.getViewPortHandler();
複製代碼
新建一個類實現FillFormatter接口
並重寫下面這個方法
public float getFillLinePosition(LineDataSet dataSet, LineDataProvider provider)
複製代碼
能夠實現單個的DataSet的實如今哪一個位置中止繪製
public class MyCustomFillFormatter implements FillFormatter {
@Override
public float getFillLinePosition(LineDataSet dataSet, LineDataProvider dataProvider) {
float myDesiredFillPosition = ...;
// put your logic here...
return myDesiredFillPosition;
}
}
複製代碼
把格式化添加到圖表中
lineDataSet.setFillFormatter(new MyCustomFillFormatter());
複製代碼
默認的實現---->DefaultFillFormatter.