1
使用AChartEngine,我希望能够为XYSeriesRenderer.setChartValuesTextAlign()指定一种Align.AUTO,使它根据位置不同对齐(实际上,minX点的.LEFT, .RIGHT为maxX点,其余为.CENTER)。这将使所有值易于阅读。是否有机会在不修改源代码的情况下实现这样的显示?AChartEngine显示值对齐
使用AChartEngine,我希望能够为XYSeriesRenderer.setChartValuesTextAlign()指定一种Align.AUTO,使它根据位置不同对齐(实际上,minX点的.LEFT, .RIGHT为maxX点,其余为.CENTER)。这将使所有值易于阅读。是否有机会在不修改源代码的情况下实现这样的显示?AChartEngine显示值对齐
好的,OOP去救援。 :-)
public class LineChartAligned extends LineChart {
private static final long serialVersionUID = 1L;
public LineChartAligned(XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) {
super(dataset, renderer);
}
@Override
protected void drawChartValuesText(Canvas canvas, XYSeries series, SimpleSeriesRenderer renderer, Paint paint, List<Float> points, int seriesIndex, int startIndex) {
if (points.size() > 1) {
float previousPointX = points.get(0);
float previousPointY = points.get(1);
for (int k = 0; k < points.size(); k += 2) {
if (k == 2) {
if (Math.abs(points.get(2) - points.get(0)) > renderer.getDisplayChartValuesDistance() || Math.abs(points.get(3) - points.get(1)) > renderer.getDisplayChartValuesDistance()) {
paint.setTextAlign(Align.LEFT); // <<<
drawText(canvas, getLabel(renderer.getChartValuesFormat(), series.getY(startIndex)), points.get(0), points.get(1) - renderer.getChartValuesSpacing(), paint, 0);
paint.setTextAlign(renderer.getChartValuesTextAlign()); // <<<
drawText(canvas, getLabel(renderer.getChartValuesFormat(), series.getY(startIndex + 1)), points.get(2), points.get(3) - renderer.getChartValuesSpacing(), paint, 0);
previousPointX = points.get(2);
previousPointY = points.get(3);
}
}
else if (k > 2) {
if (Math.abs(points.get(k) - previousPointX) > renderer.getDisplayChartValuesDistance() || Math.abs(points.get(k + 1) - previousPointY) > renderer.getDisplayChartValuesDistance()) {
paint.setTextAlign((k >= points.size() - 2) ? Align.RIGHT : renderer.getChartValuesTextAlign()); // <<<
drawText(canvas, getLabel(renderer.getChartValuesFormat(), series.getY(startIndex + k/2)), points.get(k), points.get(k + 1) - renderer.getChartValuesSpacing(), paint, 0);
previousPointX = points.get(k);
previousPointY = points.get(k + 1);
}
}
}
}
else
for (int k = 0; k < points.size(); k += 2)
drawText(canvas, getLabel(renderer.getChartValuesFormat(), series.getY(startIndex + k/2)), points.get(k), points.get(k + 1) - renderer.getChartValuesSpacing(), paint, 0);
}
}
有没有这种确切的行为,但你可以使用注释。你可以把它们放在你想要的任何图形中:
series.addAnnotation(text, x, y);
是的,谢谢你,但是......它不会很好地出现在一组距离在图表上,它不会一致,除非我开始计算字符串宽度(考虑到变焦和一切)。此外,如果我没有弄错,它会使用图表标题的颜色和文字大小,这不是一个真正的优势。 –