2016-07-05 4 views
0

Когда я увеличиваю свою диаграмму по оси X, график исчезает. Почему это может произойти? Lib версия - MPAndroidChart: v3.0.0-beta1Диаграмма исчезает при масштабировании

enter image description here

Я использовал пример LineChartTime. И отредактировал long hourMillis = 36000L; в функции setData() и получил проблему с графическим представлением.

ОБНОВЛЕНО !!!

Проблема возникает, когда выбор времени меньше, чем 360000 миллисов или 6 минут. Когда 1 час, как в примере «LineChartTime», все в порядке. Но если я уменьшу значение x от 1451606400000L до 0 и сделаю выборку времени равной 1 миллисеку, все будет в порядке. Поэтому я думаю, что основная проблема в float-типе значения x, что обрабатывает неправильные большие значения LONG.

Итак, я нашел временное решение. Когда я получить текущее время, я уменьшить его на 1451606400000L (2016 01,01 00:00) и рисовать не такие большие значения, но и изменить Formatter строку

 xAxis.setValueFormatter(new AxisValueFormatter() { 

     private FormattedStringCache.Generic<Long, Date> mFormattedStringCache = new FormattedStringCache.Generic<>(new SimpleDateFormat("yyyy dd MMM HH:mm")); 

     @Override 
     public String getFormattedValue(float value, AxisBase axis) { 
      Long v = (long) value + 1451606400000L; 
      return mFormattedStringCache.getFormattedValue(new Date(v), v); 
     } 

Если кто-то есть другое решение, пожалуйста, дайте мне знать.

+1

Отправьте свое решение в поле ниже, а затем откройте последнее изменение. Мы предпочитаем не сдавать ответы на вопросы, и мы предпочитаем не иметь [решены] хаки в названии. Благодарю. – halfer

ответ

0

Когда вы увеличиваете масштаб, библиотека не отображает значения, которые находятся за пределами видимой области. Алгоритмы здесь используют тип float (вероятно, по многим причинам), но это вызывает проблемы с «большими» числами.

float является внутренним 32-разрядным IEEE 754, что означает, что он может представлять только около 7 значащих цифр. Временные метки в миллисекундах урезают последние цифры (по крайней мере, для определения линий, которые нужно нарисовать), поэтому некоторые из ваших линий исчезнут.

Вариант 1: Использовать временные метки в пределах диапазона float точности, или, по крайней мере, ближе к нему.

Если вы черчения текущих данных, вычитать в сохраненной значения System.currentTimeMillis() из меток времени и добавить такое же значение обратно при форматировании, как вы делали это в своем собственном решении. Если вы можете жить с точностью до 1 секунды, разделите ваши метки времени на 60000 и соответствующим образом настройте форматтер.

Вариант 2: Обрежьте библиотеку, чтобы нарисовать линии за пределами видимой области.

Быстрое исправление, которое будет работать, если у вас нет большого набора данных, чтобы отобразить все. Для линейных диаграмм, изменить содержание следующих 2-х методов в BarLineChartBase.java вблизи линии 1280, как это:

public float getLowestVisibleX() { 
    return mXAxis.mAxisMinimum; 
} 

public float getHighestVisibleX() { 
    return mXAxis.mAxisMaximum; 
} 

Это, вероятно, дико неэффективно, что может или не может быть проблемой в зависимости от размера набора данных.

Смежные вопросы