問題を取り戻すには: 問題のチャートは ですXYChart
。右にパンし、既存の値の前にXYSeries.add()
その位置を使用して新しい項目をシリーズに追加すると、更新中のチャート ライン自体は [OK] と表示されますが、個々のチャート ポイントの上に表示されるチャート値は、新しい値と同期しなくなります。これは、ソースを変更して解決した方法です。
ソースの問題はXYChart.drawChartValuesText()
、引数を受け取り、startIndex
それを使用して表示するラベルの値を検索することであり、これが問題の原因XYSeries.getY()
です。したがって、大きなXYChart.draw()
関数では、実際に を呼び出す前にdrawSeries()
、新しい変数を設定します。
final List<Double> chartValues = new ArrayList<Double>();
後でリストに加えvalues
て、実際の値もこのリストに追加します。
values.add(xValue);
values.add(yValue);
chartValues.add(yValue);
次の関数を呼び出すときにそれを渡します(これはソースで2回発生します):
drawSeries(series, canvas, paint, points, seriesRenderer, yAxisValue, i, or, startIndex, chartValues);
XYChart.drawSeries()
、次に、それを次のように渡します。
drawChartValuesText(canvas, series, seriesRenderer, paint, pointsList, seriesIndex, startIndex, values);
最後に、ベースのルックアップXYChart.drawChartValuesText()
の代わりにこれらの新しい値を使用します。startIndex
protected void drawChartValuesText(Canvas canvas, XYSeries series, XYSeriesRenderer renderer, Paint paint, List<Float> points, int seriesIndex, int startIndex, List<Double> values) {
if (points.size() > 2) { // there are more than one point
// record the first point's position
float previousPointX = points.get(0);
float previousPointY = points.get(1);
for (int k = 0; k < points.size(); k += 2)
if (k == 2) { // decide whether to display first two points' values or not
if (Math.abs(points.get(2) - points.get(0)) > renderer.getDisplayChartValuesDistance() || Math.abs(points.get(3) - points.get(1)) > renderer.getDisplayChartValuesDistance()) {
// first point
drawText(canvas, getLabel(renderer.getChartValuesFormat(), values.get(k)), points.get(0), points.get(1) - renderer.getChartValuesSpacing(), paint, 0);
// second point
drawText(canvas, getLabel(renderer.getChartValuesFormat(), values.get(k + 1)), points.get(2), points.get(3) - renderer.getChartValuesSpacing(), paint, 0);
previousPointX = points.get(2);
previousPointY = points.get(3);
}
}
else if (k > 2)
// compare current point's position with the previous point's, if they are not too close, display
if (Math.abs(points.get(k) - previousPointX) > renderer.getDisplayChartValuesDistance() || Math.abs(points.get(k + 1) - previousPointY) > renderer.getDisplayChartValuesDistance()) {
drawText(canvas, getLabel(renderer.getChartValuesFormat(), values.get(k / 2)), points.get(k), points.get(k + 1) - renderer.getChartValuesSpacing(), paint, 0);
previousPointX = points.get(k);
previousPointY = points.get(k + 1);
}
}
else
for (int k = 0; k < points.size(); k += 2)
drawText(canvas, getLabel(renderer.getChartValuesFormat(), values.get(k / 2)), points.get(k), points.get(k + 1) - renderer.getChartValuesSpacing(), paint, 0);
}
この回避策は今のところ問題を解決しているようですが、後で問題が見つかった場合は報告します。