效果預(yù)覽

6e5ny-eczwc.gif
如圖所示,最新數(shù)據(jù)將從右往左展示出來,并且X軸沒有明確的大小限制,適用于一些數(shù)據(jù)的實(shí)時(shí)查看獲取,例如CPU頻率,溫度等
實(shí)現(xiàn)思路
由于MPAndroidChart是不能直接將數(shù)據(jù)由右往左繪制,所以得往數(shù)據(jù)賦值上思考,觀察它每次運(yùn)行可以得出:
首先假設(shè)從頭到尾跑完一共需要展示60個(gè)數(shù)據(jù),那么當(dāng)?shù)谝粋€(gè)數(shù)據(jù)出來的時(shí)候,它的Entry里面的x值必定是60,當(dāng)?shù)诙l數(shù)據(jù)出來,第一條數(shù)據(jù)的x值就需要變成59,第二條數(shù)據(jù)的x值就會變成60,每次刷新一條數(shù)據(jù)前面的數(shù)據(jù)的x值就需要減一,這樣就達(dá)到了從右往左前移的效果,這樣一來,大概思路就出來了,但這里需要分兩種情況
-
還沒跑完全屏
not.jpg -
已經(jīng)跑完了全屏,后面的數(shù)據(jù)繼續(xù)刷新,但永遠(yuǎn)只顯示60個(gè)
have.jpg
第一種情況我們不需要處理,第二種情況我們得把“跑過了的”數(shù)據(jù)給移除,所以得判斷x軸是否小于0,小于0的就給remove掉
實(shí)現(xiàn)
首先先初始化樣式:
private static int maxCount = 60; //集合最大存儲數(shù)量
public static void initChart(List<Entry> mData, LineChart lineChart, long maxYValue) {
int lineColor = Color.parseColor("#ebebeb");
int textColor = Color.parseColor("#999999");
lineChart.setDragEnabled(false);
lineChart.setScaleEnabled(false);
lineChart.getDescription().setEnabled(false);
lineChart.getLegend().setEnabled(false);
lineChart.getAxisRight().setEnabled(false);
lineChart.getXAxis().setEnabled(false);
YAxis axisLeft = lineChart.getAxisLeft();
axisLeft.setAxisMinimum(0);
axisLeft.setLabelCount(10);
axisLeft.setAxisMaximum(maxYValue);
axisLeft.setGridColor(lineColor);
axisLeft.setTextColor(textColor);
axisLeft.setAxisLineColor(lineColor);
XAxis xAxis = lineChart.getXAxis();
xAxis.setDrawGridLines(false);
xAxis.setDrawLabels(false);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setAxisMinimum(0f);
xAxis.setAxisMaximum(maxCount);
xAxis.setLabelCount(maxCount);
Collections.sort(mData, new EntryXComparator());
LineData lineData = new LineData(getSet(mData));
lineData.setDrawValues(false);
lineChart.setData(lineData);
lineChart.invalidate();
}
private static LineDataSet getSet(List<Entry> mData) {
int valueColor = Color.parseColor("#2979FF");
LineDataSet set = new LineDataSet(mData, "");
set.setDrawFilled(true);
set.setFillColor(valueColor);
set.setColor(valueColor);
set.setValueTextColor(valueColor);
set.setDrawCircles(false);
set.setMode(LineDataSet.Mode.CUBIC_BEZIER);
return set;
}
把X軸的最大值設(shè)置為了60(這個(gè)可以根據(jù)需求更改),隨后在LineDataSet里將setDrawFilled設(shè)置為了true,這樣就會有實(shí)心的效果
賦值代碼:
public static void addEntry(List<Entry> mData, LineChart lineChart, float yValues) {
if (lineChart != null
&& lineChart.getData() != null &&
lineChart.getData().getDataSetCount() > 0) {
int size = mData.size();
if (size == 0) {
Entry entry = new Entry(maxCount, yValues);
mData.add(entry);
} else {
boolean needRemove = false;
for (Entry e : mData) {
float x = e.getX() - 1;
if (x < 0) {
needRemove = true;
}
e.setX(x);
}
if (needRemove) {
mData.remove(0);
}
Entry entry = new Entry(maxCount, yValues);
mData.add(entry);
}
LineData lineData = new LineData(getSet(mData));
lineData.setDrawValues(false);
lineChart.setData(lineData);
lineChart.invalidate();
}
}
賦值邏輯就在這個(gè)方法里了,只需要傳入我們需要的y軸數(shù)據(jù),就能幫你自動刷新里面的數(shù)據(jù)了。
最后附上demo:
demo

