MPAndroidChart LineChart неправильно отображает - PullRequest
0 голосов
/ 27 августа 2018

Я работаю над продуктом, который регистрирует частоту сердечных сокращений и отправляет эти данные в мое приложение для Android.Приложение представляет эти данные, используя MPAndroidChart в режиме реального времени .Обратите внимание, что я использую последнюю версию библиотеки.

У меня возникли проблемы с некоторыми телефонами.Я протестировал его на Moto G2, Realme 1, OnePlus 5t, OnePlus 6, Lenovo K8 plus.

Диаграмма на телефоне OnePlus 6 (это неверно): enter image description here

Диаграмма на телефоне Moto G2 (это правильно): enter image description here

Обновление Код:

 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 раз.Я думаю, что это происходит только на хороших или последних телефонах, таких как Realme, OnePlus.Но я не могу понять, почему это происходит.

Любая помощь будет признательна.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

После этой строки:

data.notifyDataChanged();

Добавить следующее:

lineChartHeart.setData(data);

После этой строки:

lineChartHeart.notifyDataSetChanged();

Добавить следующую строку:

lineChartHeart.invalidate();
0 голосов
/ 22 ноября 2018

Я нашел решение.

Я хотел бы прояснить, что это не ошибка в библиотеке MPAndroidChart.Проблема заключается в Android BLE.Приложение читает файлы с устройства со скоростью 30 в секунду (то есть 125 наборов данных для графика).Поскольку частота запросов на чтение высока, BLE пропускал немного данных между ними.

Поскольку премиальные телефоны обладают более высокой вычислительной мощностью, предыдущие данные добавлялись в список.Вот почему график строился так, как показано в вопросе.

...