Iは、以下のコードのような2 LineChart
を示すために少しをReal Time Line Chart変形例。MPAndroidChart複数の実時間線チャート - 正しいXINDEXで添加していないエントリ
問題:ViewPort
が間違って移動され、正しく動作しません。実際のポイント(Entry
)が追加されるよりもずっと速く動いています。つまり、Entry
が間違った場所に追加され、ViewPort
が制御不能に動き続けます。 Entry
が追加されるたびに徐々に右に移動する必要があります。この問題を解決するのを手伝ってください。以下の変更を伴う@Tonyのコメントで解決
private int year = 2015;
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss.SSS");
private int[] mColors = {Color.BLUE,Color.YELLOW,Color.CYAN,Color.MAGENTA,Color.GREEN};
private int mCurrentColorIndex = 0;
private synchronized void addEntry(String id, float value) {
LineData data = mChart.getData();
if (data != null) {
ILineDataSet set = data.getDataSetByLabel(id,true);
//ILineDataSet set1 = data.getDataSetByIndex(0);
if (set == null) {
set = createSet(id, mColors[(mCurrentColorIndex++)%mColors.length ]);
data.addDataSet(set);
}
String xValue = sdf.format(new Date());
// add a new x-value first
data.addXValue(xValue);
set.addEntry(new Entry(value, set.getEntryCount(), 0));
// let the chart know it's data has changed
mChart.notifyDataSetChanged();
// limit the number of visible entries
mChart.setVisibleXRangeMaximum(30);
// mChart.setVisibleYRange(30, AxisDependency.LEFT);
// move to the latest entry
mChart.moveViewToX(data.getXValCount() - 31);
// this automatically refreshes the chart (calls invalidate())
// mChart.moveViewTo(data.getXValCount()-7, 55f,
// AxisDependency.LEFT);
}
}
private LineDataSet createSet(String label, int color) {
LineDataSet set = new LineDataSet(null, label);
set.setAxisDependency(AxisDependency.LEFT);
set.setColor(color);
set.setCircleColor(Color.WHITE);
set.setLineWidth(2f);
set.setCircleRadius(4f);
set.setFillAlpha(65);
set.setFillColor(color);
set.setHighLightColor(Color.rgb(244, 117, 117));
set.setValueTextColor(Color.WHITE);
set.setValueTextSize(9f);
set.setDrawValues(false);
return set;
}
private void feedMultiple() {
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i < 50; i++) {
runOnUiThread(new Runnable() {
@Override
public void run() {
addEntry("name1", (float)(Math.random() * 40) + 30f);
}
});
try {
Thread.sleep(35);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i < 100; i++) {
runOnUiThread(new Runnable() {
@Override
public void run() {
addEntry("name2", (float)(Math.random() * 40) + 30f);
}
});
try {
Thread.sleep(35);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
このライブラリは誤解されています。変更set.addEntry(新しいエントリ(値、set.getEntryCount()、0));新しいエントリ(value、data.getXValCount()、0)); set.addEntry(新しいエントリ問題を修正します。 – Tony
なぜmChart.setVisibleXRangeMaximum(30)ですか? ViewPortを動かすためにaddEntryに追加する必要があります。 * initial *メソッドにそれを削除すると、ViewPortの移動が期待通りに機能しません。 – Tony