MPAndroidChart LineChart 绘制不正确
MPAndroidChart LineChart is not plotting correctly
我正在开发一种记录心率并将该数据发送到我的 Android 应用程序的产品。该应用程序使用 MPAndroidChart 实时 呈现此数据。请注意,我使用的是最新版本的库。
我在某些 phone 中遇到了一些问题。我已经在 Moto G2、Realme 1、OnePlus 5t、OnePlus 6、Lenovo K8 plus 上进行了测试。
OnePlus 6 上的图表phone(这是错误的):
Moto G2 上的图表phone(正确):
更新
代码:
private void initHeartLineChart(){
lineChartHeart.getDescription().setEnabled(false);
lineChartHeart.getAxisRight().setEnabled(false);
lineChartHeart.getLegend().setEnabled(false);
lineChartHeart.setDrawGridBackground(false);
lineChartHeart.setPinchZoom(false);
lineChartHeart.setScaleEnabled(false);
lineChartHeart.setDoubleTapToZoomEnabled(false);
lineChartHeart.setScaleYEnabled(false);
lineChartHeart.setDragXEnabled(false);
lineChartHeart.setDragYEnabled(false);
XAxis xAxis = lineChartHeart.getXAxis();
xAxis.setEnabled(false);
xAxis.setDrawGridLines(false);
xAxis.setGranularity(1f);
YAxis yAxisHeart = lineChartHeart.getAxisLeft();
yAxisHeart.setEnabled(false);
yAxisHeart.setAxisMaximum(600f);
yAxisHeart.setAxisMinimum(-600f);
yAxisHeart.setDrawAxisLine(false);
yAxisHeart.setDrawZeroLine(false);
//add empty data
lineChartHeart.setData(new LineData());
lineChartHeart.setViewPortOffsets(0,0,0,0);
}
private LineDataSet createHeartDataSet() {
LineDataSet set = new LineDataSet(null, "Live Heart");
set.setAxisDependency(YAxis.AxisDependency.LEFT);
set.setColor(getResources().getColor(R.color.heart_color));
set.setLineWidth(1f);
set.setDrawCircles(false);
set.setHighlightEnabled(false);
set.setDrawValues(false);
set.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
set.setCubicIntensity(0.2f);
return set;
}
private void addNewHeartEntry(double heartRate) {
LineData data = lineChartHeart.getData();
if (data != null) {
ILineDataSet set = data.getDataSetByIndex(0);
if (set == null) {
set = createHeartDataSet();
data.addDataSet(set);
}
data.addEntry(new Entry(set.getEntryCount(), (float) heartRate), 0);
data.notifyDataChanged();
lineChartHeart.notifyDataSetChanged();
lineChartHeart.setVisibleXRangeMaximum(625);
// move to the latest entry
lineChartHeart.moveViewToX(set.getEntryCount());
}
}
两种情况下的代码、人员和设备都相同。我测试了很多次。我还检查了发送到图表的数据。数据是正确的。图表只是没有正确绘制。如果您可能已经注意到,该图表正在以某种模式绘制数据。它重复两点 3-5 次。我认为它只发生在好的或最新的 phone 上,例如 Realme、OnePlus。但我无法弄清楚为什么会这样。
如有任何帮助,我们将不胜感激。
我找到了解决方案。
我想澄清一下,这不是 MPAndroidChart 库中的错误。问题在于Android BLE。该应用程序以每秒 30 个的速率从设备读取文件(即图形的 125 个数据集)。由于读取请求率很高,BLE 在两者之间跳过了一些数据。
由于高级手机的处理能力更快,因此列表中添加了以前的数据。这就是图表如问题所示绘制的原因。
这一行之后:
data.notifyDataChanged();
添加以下内容:
lineChartHeart.setData(data);
这一行之后:
lineChartHeart.notifyDataSetChanged();
添加以下行:
lineChartHeart.invalidate();
我正在开发一种记录心率并将该数据发送到我的 Android 应用程序的产品。该应用程序使用 MPAndroidChart 实时 呈现此数据。请注意,我使用的是最新版本的库。
我在某些 phone 中遇到了一些问题。我已经在 Moto G2、Realme 1、OnePlus 5t、OnePlus 6、Lenovo K8 plus 上进行了测试。
OnePlus 6 上的图表phone(这是错误的):
Moto G2 上的图表phone(正确):
更新 代码:
private void initHeartLineChart(){
lineChartHeart.getDescription().setEnabled(false);
lineChartHeart.getAxisRight().setEnabled(false);
lineChartHeart.getLegend().setEnabled(false);
lineChartHeart.setDrawGridBackground(false);
lineChartHeart.setPinchZoom(false);
lineChartHeart.setScaleEnabled(false);
lineChartHeart.setDoubleTapToZoomEnabled(false);
lineChartHeart.setScaleYEnabled(false);
lineChartHeart.setDragXEnabled(false);
lineChartHeart.setDragYEnabled(false);
XAxis xAxis = lineChartHeart.getXAxis();
xAxis.setEnabled(false);
xAxis.setDrawGridLines(false);
xAxis.setGranularity(1f);
YAxis yAxisHeart = lineChartHeart.getAxisLeft();
yAxisHeart.setEnabled(false);
yAxisHeart.setAxisMaximum(600f);
yAxisHeart.setAxisMinimum(-600f);
yAxisHeart.setDrawAxisLine(false);
yAxisHeart.setDrawZeroLine(false);
//add empty data
lineChartHeart.setData(new LineData());
lineChartHeart.setViewPortOffsets(0,0,0,0);
}
private LineDataSet createHeartDataSet() {
LineDataSet set = new LineDataSet(null, "Live Heart");
set.setAxisDependency(YAxis.AxisDependency.LEFT);
set.setColor(getResources().getColor(R.color.heart_color));
set.setLineWidth(1f);
set.setDrawCircles(false);
set.setHighlightEnabled(false);
set.setDrawValues(false);
set.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
set.setCubicIntensity(0.2f);
return set;
}
private void addNewHeartEntry(double heartRate) {
LineData data = lineChartHeart.getData();
if (data != null) {
ILineDataSet set = data.getDataSetByIndex(0);
if (set == null) {
set = createHeartDataSet();
data.addDataSet(set);
}
data.addEntry(new Entry(set.getEntryCount(), (float) heartRate), 0);
data.notifyDataChanged();
lineChartHeart.notifyDataSetChanged();
lineChartHeart.setVisibleXRangeMaximum(625);
// move to the latest entry
lineChartHeart.moveViewToX(set.getEntryCount());
}
}
两种情况下的代码、人员和设备都相同。我测试了很多次。我还检查了发送到图表的数据。数据是正确的。图表只是没有正确绘制。如果您可能已经注意到,该图表正在以某种模式绘制数据。它重复两点 3-5 次。我认为它只发生在好的或最新的 phone 上,例如 Realme、OnePlus。但我无法弄清楚为什么会这样。
如有任何帮助,我们将不胜感激。
我找到了解决方案。
我想澄清一下,这不是 MPAndroidChart 库中的错误。问题在于Android BLE。该应用程序以每秒 30 个的速率从设备读取文件(即图形的 125 个数据集)。由于读取请求率很高,BLE 在两者之间跳过了一些数据。
由于高级手机的处理能力更快,因此列表中添加了以前的数据。这就是图表如问题所示绘制的原因。
这一行之后:
data.notifyDataChanged();
添加以下内容:
lineChartHeart.setData(data);
这一行之后:
lineChartHeart.notifyDataSetChanged();
添加以下行:
lineChartHeart.invalidate();