使用MPAndroidChart繪制類似心電圖效果

效果預(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

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

友情鏈接更多精彩內(nèi)容