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 };
}
Это решит вашу проблему