1. 程式人生 > >MPAndroidChart筆記(LineChart多個相同x不同y資料處理)

MPAndroidChart筆記(LineChart多個相同x不同y資料處理)

基本用法這裡就不多說了,網上可以找到大把這類文章。

這裡我說說自己改原始碼的一些經歷,(這裡只說LineChart),如果對你有用可以看看。可能會比較囉嗦,有錯別字什麼的,諒解。。。。
(主要講LineChart中資料有相同x,不同y的處理方法,沒有什麼高難度技術點,對遇到問題的人有點用,沒遇到該問題的一文不值)

先來看一張圖

這裡寫圖片描述

01

1

.看到上圖中橙色虛線沒,當時我想找到設定自帶屬性吧他去掉。可惜沒找到(如果有小夥伴找到可以告訴我),然後就去找它在哪裡畫的。

在renderer包下面有一個LineChartRenderer類,有一個drawHighlighted()方法,我們來看看原始碼


public void drawHighlighted(Canvas c, Highlight[] indices) {

LineData lineData =mChart.getLineData();

for(Highlight high : indices) {

ILineDataSet set = lineData.getDataSetByIndex(high.getDataSetIndex());

if(set ==null|| !set.isHighlightEnabled())

continue;

Entry e = set.getEntryForXPos(high.getX());

if
(!isInBoundsX(e, set)) continue; MPPointD pix =mChart.getTransformer(set.getAxisDependency()).getPixelsForValues(e.getX(), e.getY() *mAnimator .getPhaseY()); high.setDraw((float) pix.x, (float) pix.y); // draw the lines drawHighlightLines(c, (float) pix.x, (float) pix.y, set); } }

然後找到哪裡呼叫了這個方法,OK,在BarLineChartBase的onDraw()裡面有一個


// if highlighting is enabled

if(valuesToHighlight()){

  mRenderer.drawHighlighted(canvas,mIndicesToHighlight);

}

我們在看看valuesToHighlight()這個方法


public boolean valuesToHighlight() {

return mIndicesToHighlight==null||mIndicesToHighlight.length<=0

||mIndicesToHighlight[0] ==null?false:true;

}

這裡只判斷是mIndicesToHighlight,所以貌似是沒有設定屬性的地方去掉。這裡最好的方法就是改改原始碼,自己加一個變數去控制畫不畫。怎麼寫我就不多說了。

(或者你把drawHighlightLines(c, (float) pix.x, (float) pix.y, set);注掉,永遠不用)

(後來還真發現了這個是可以設定的,


LineDataSet set = new LineDataSet(entries, lineName);
set.setHighlightEnabled(false); //設定十字線 是否啟用

看來還是自己沒找對地方。。。好尷尬啊!!!)

2

.圖01中的氣泡,當我們點選或者移動的時候,氣泡會顯示出來,這個氣泡的樣子可以自定義。有一個叫MarkerView的類,基本用法這裡不多說。我來說說我做的一個需求。

第一次進來的時候需要LineChart最後一個點的氣泡顯示處理啊。就是預設顯示最後一點的氣泡。點選其他點的時候預設氣泡消失,氣泡在點選那個點顯示。其實就是氣泡只能存在一個。當然,如果改原始碼的話也可以讓多個同時存在,不過貌似沒有這種需求。好,廢話扯多了,直接檢視原始碼。

Chart類裡面有一個drawMarkers()方法,這個就是畫氣泡用的。在BarLineChartBase的onDraw()裡面有呼叫。我們用LineChart是整合BarLineChartBase的,也就是說每次重新整理LineChart的時候都會呼叫。

“` python

protected void drawMarkers(Canvas canvas) {

    if (mMarkerView == null || !mDrawMarkerViews || !valuesToHighlight())
        return;

    for (int i = 0; i < mIndicesToHighlight.length; i++) {

        Highlight highlight = mIndicesToHighlight[i];

        IDataSet set = mData.getDataSetByIndex(highlight.getDataSetIndex());

        Entry e = mData.getEntryForHighlight(mIndicesToHighlight[i]);
        int entryIndex = set.getEntryIndex(e);

        // make sure entry not null
        if (e == null || entryIndex > set.getEntryCount() * mAnimator.getPhaseX())
            continue;

        float[] pos = getMarkerPosition(highlight);

        // check bounds
        if (!mViewPortHandler.isInBounds(pos[0], pos[1]))
            continue;

        // callbacks to update the content
        mMarkerView.refreshContent(e, highlight);

        mMarkerView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        mMarkerView.layout(0, 0, mMarkerView.getMeasuredWidth(),
                mMarkerView.getMeasuredHeight());

        if (pos[1] - mMarkerView.getHeight() <= 0) {
            float y = mMarkerView.getHeight() - pos[1];
            mMarkerView.draw(canvas, pos[0], pos[1] + y);
        } else {
            mMarkerView.draw(canvas, pos[0], pos[1]);
        }
    }
}