6

[ MPAndroidChart の Github にも投稿]

ローリング ウィンドウを使用したリアルタイム グラフが必要ですが、そのときに「問題」に遭遇しました。データの追加は問題ありませんが、グラフの現在の幅よりも大きい Xvalue(index) を持つデータを追加した後、[X] Xvalues を常に表示できるとは限らないため、グラフは自動スクロールしません。

問題の例: ここに画像の説明を入力 グラフ3の結果は、リアルタイム データの表示に必要なものではありません。スクロールウィンドウははるかに便利です。だから私はこれをアーカイブしようとしました..

私の作業の「解決策」は、最初の Xvalue を削除し、新しい Xvalue を追加して、画面 1 のすべてのエントリのすべての Xindex を左に移動することでした。結果は次のようなコードです。

int GRAPH_WIDTH = 10;
LineData lineData = chart.getData();
LineDataSet lineDataSet = lineData.getDataSetByIndex(0);                        
int count = lineDataSet.getEntryCount();

// Make rolling window
if (lineData.getXValCount() <= count) {
    // Remove/Add XVal
    lineData.getXVals().add("" + count);
    lineData.getXVals().remove(0);

    // Move all entries 1 to the left..
    for (int i=0; i < count; i++) {
        Entry e = lineDataSet.getEntryForXIndex(i);
        if (e==null) continue;

        e.setXIndex(e.getXIndex() - 1);
    }

    // Set correct index to add value
    count = GRAPH_WIDTH; 
}

// Add new value
lineData.addEntry(new Entry([random value], count), 0);

// Make sure to draw
chart.notifyDataSetChanged();
chart.invalidate();

これは実際には非常にうまく機能しますが (こちらのビデオで見られるように)、もっと簡単な方法が必要だと思います。APIウィンドウ/スクロールを見落としているかもしれません..しかし、これがこの結果をアーカイブする「正しい」方法である場合、ライブラリにこの種のグラフのサポートを追加することは拡張になります。

4

2 に答える 2

4

ビデオをありがとう。かなり複雑ですが、非常にうまく機能する回避策を見つけたことに驚いています。

残念ながら、これは現在、あなたが望むものを達成する唯一の方法です. おそらくあなたのコードの一部を再利用して、これをすぐに簡単にすることに取り組みます。

次の 2 つの方法も参照してください。

setScaleMinima(...) centerViewPort(...)

于 2015-01-24T14:41:14.777 に答える
0

私はあなたのコードを取り、それを少し変更しました。一度に GRAPH_WIDTH 点までしか表示されません。次に、スクロールして古いデータを削除します。比較的最近のデータのみに関心がある場合に便利です。それはあなたが行っていたものですか?

public void addTimeEntry() {

    String entry_date_time = new SimpleDateFormat("MMM d - HH:mm:ss").format(new Date());
    LineData lineData = mChart.getData();
    int GRAPH_WIDTH = 15;

    if (lineData != null) {

        LineDataSet set = lineData.getDataSetByIndex(0);

        if (set == null) {
            set = createSet();
            lineData.addDataSet(set);
        }

        // Make rolling window
        if (lineData.getXValCount() > GRAPH_WIDTH) {
            lineData.getXVals().remove(0);
            set.removeEntry(0);

            lineData.getXVals().add(entry_date_time);
            lineData.addEntry(new Entry((float) (Math.random() * 40) + 30f, GRAPH_WIDTH), 0);

           // lineData.getXVals().add(entry_date_time);
            // Move all entries 1 to the left..
            for (int i=0; i < set.getEntryCount(); i++) {
                Entry e = set.getEntryForXIndex(i);
                if (e==null) continue;

                e.setXIndex(e.getXIndex() - 1);
            }
        }
        else{
            lineData.getXVals().add(entry_date_time);
            lineData.addEntry(new Entry((float) (Math.random() * 40) + 30f, lineData.getXValCount()-1), 0);
        }

        // let the chart know it's data has changed
        mChart.notifyDataSetChanged();
        mChart.invalidate();
    }
}
于 2015-08-12T08:30:35.970 に答える