2013-06-19 50 views
1

使用AChartEngine,我希望能够为XYSeriesRenderer.setChartValuesTextAlign()指定一种Align.AUTO,使它根据位置不同对齐(实际上,minX点的.LEFT, .RIGHT为maxX点,其余为.CENTER)。这将使所有值易于阅读。是否有机会在不修改源代码的情况下实现这样的显示?AChartEngine显示值对齐

回答

1

好的,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); 
    } 

} 
1

有没有这种确切的行为,但你可以使用注释。你可以把它们放在你想要的任何图形中:

series.addAnnotation(text, x, y); 
+0

是的,谢谢你,但是......它不会很好地出现在一组距离在图表上,它不会一致,除非我开始计算字符串宽度(考虑到变焦和一切)。此外,如果我没有弄错,它会使用图表标题的颜色和文字大小,这不是一个真正的优势。 –