AchartEngineLine Chart в Android - Линия исчезает при панорамировании

Я столкнулся с проблемой в диаграмме рассеяния AchartEngine в Android. Линия между каждой точкой исчезает при панорамировании после установки масштаба на уровень. Я попытался HardwareAcceleration в false и установить значение LayerType в null и все. Но проблема остается.

Achartengine версия 1.1.0. Android-устройство - Galaxy S4, S3. Не могли бы вы помочь мне в этом?

Скриншот размещен здесь,

Снимок экрана вставлен вниз без линии между точками графикаСпасибо

JRH

2 ответа

После двух дней усилий я смог решить проблему. Это произошло из-за Float.NaN для одного из значений Path при рисовании линии.

Проблема была в методе AbstractChart -> drawPath. В этом случае метод convertDrawPoints() возвращает массив с плавающей точкой, который содержит Float.NaN в одном случае. Я не знаю проблему, стоящую за этим. Но я мог бы преодолеть это с помощью метода Canvas.drawLine.

Спасибо

JRH

Это потому, что метод AbstarctChart==> CalculayDrawPoints() возвращает массив с плавающей точкой, который содержит Float.NaN.

Это потому, что во время вычисления иногда значение возвращает 0, а после деления значения на 0 мы получаем Float.NaN Все, что разделено на ноль, не определено

Поэтому обновите ваш код метода CalculateDrawPoints() следующим

private static float[] calculateDrawPoints(float p1x, float p1y, float p2x, float p2y,
      int screenHeight, int screenWidth) {
    float drawP1x = 0;
    float drawP1y;
    float drawP2x = 0;
    float drawP2y;

    if (p1y > screenHeight) {
      // Intersection with the top of the screen
      float m = (p2y - p1y) / (p2x - p1x);
      if (m != 0) {
        drawP1x = (screenHeight - p1y + m * p1x) / m;
      } else {
        drawP1x = (screenHeight - p1y + m * p1x);
      }
      drawP1y = screenHeight;

      if (drawP1x < 0) {
        // If Intersection is left of the screen we calculate the intersection
        // with the left border
        drawP1x = 0;
        drawP1y = p1y - m * p1x;
      } else if (drawP1x > screenWidth) {
        // If Intersection is right of the screen we calculate the intersection
        // with the right border
        drawP1x = screenWidth;
        drawP1y = m * screenWidth + p1y - m * p1x;
      }
    } else if (p1y < 0) {
      float n = p2x - p1x;
      float m = 0;
      if (n != 0) {
        m = (p2y - p1y) / n;
      } else {
        m = (p2y - p1y);
      }
      if (m != 0) {
        drawP1x = (-p1y + m * p1x) / m;
      } else {
        drawP1x = (-p1y + m * p1x);
      }
      drawP1y = 0;
      if (drawP1x < 0) {
        drawP1x = 0;
        drawP1y = p1y - m * p1x;
      } else if (drawP1x > screenWidth) {
        drawP1x = screenWidth;
        drawP1y = m * screenWidth + p1y - m * p1x;
      }
    } else {
      // If the point is in the screen use it
      drawP1x = p1x;
      drawP1y = p1y;
    }

    if (p2y > screenHeight) {
      float n = (p2x - p1x);
      float m = 0;
      if (n != 0) {
        m = (p2y - p1y) / n;
      } else {
        m = (p2y - p1y);
      }
      if (m != 0) {
        drawP2x = (screenHeight - p1y + m * p1x) / m;
      } else {
        drawP2x = (screenHeight - p1y + m * p1x);
      }

      drawP2y = screenHeight;
      if (drawP2x < 0) {
        drawP2x = 0;
        drawP2y = p1y - m * p1x;
      } else if (drawP2x > screenWidth) {
        drawP2x = screenWidth;
        drawP2y = m * screenWidth + p1y - m * p1x;
      }
    } else if (p2y < 0) {
      float n = (p2x - p1x);
      float m = 0;
      if (n != 0) {
        m = (p2y - p1y) / n;
      } else {
        m = (p2y - p1y);
      }
      if (m != 0) {
        drawP2x = (-p1y + m * p1x) / m;
      } else {
        drawP2x = (-p1y + m * p1x);
      }
      drawP2y = 0;
      if (drawP2x < 0) {
        drawP2x = 0;
        drawP2y = p1y - m * p1x;
      } else if (drawP2x > screenWidth) {
        drawP2x = screenWidth;
        drawP2y = m * screenWidth + p1y - m * p1x;
      }
    } else {
      // If the point is in the screen use it
      drawP2x = p2x;
      drawP2y = p2y;
    }
    return new float[] { drawP1x, drawP1y, drawP2x, drawP2y };
  }

Это решит вашу проблему

Другие вопросы по тегам