Android MPCharts x轴自动换行重叠

时间:2018-09-21 13:12:36

标签: android

我在iOS中使用了Charts库,其中提供了'xAxis.wordWrapEnabled = true'来阻止x轴标签彼此重叠。

对于x轴值,Android上似乎没有相同的选项。 (仅适用于图例)

请问我如何阻止x轴标签在Android MPChart库中重叠?

1 个答案:

答案 0 :(得分:0)

您可以在下面自定义类似XAxis的代码。它将自动将冗长的字符串分解为下一行,以避免重叠。

设置绘制多条线的偏移量

chart.getXAxis().setYOffset(12); chart.setXAxisRenderer(new MyXAxisRenderer(chart.getViewPortHandler(),chart.getXAxis(),chart.getTransformer(YAxis.AxisDependency.LEFT), labelCount));

public class MyXAxisRenderer extends XAxisRenderer {
private int labelCount;

public MyXAxisRenderer(ViewPortHandler viewPortHandler, XAxis xAxis, Transformer trans,
                        int labelCount) {
    super(viewPortHandler, xAxis, trans);
    this.labelCount= labelCount;
}

@Override
protected void drawLabel(Canvas c, String formattedLabel, float x, float y, MPPointF anchor, float angleDegrees) {
    int offset = 24;
    float widthUnit = mViewPortHandler.contentWidth() / labelCount - offset;
    Rect rect = new Rect();
    int labelFittingLength = formattedLabel.length();
    mAxisLabelPaint.getTextBounds(formattedLabel, 0, labelFittingLength, rect);
    while (rect.width() > widthUnit) {
        labelFittingLength--;
        mAxisLabelPaint.getTextBounds(formattedLabel, 0, labelFittingLength, rect);
    }
    // space 5dp from XAxis
    float yPreviousLine = y - mXAxis.getYOffset() + 15;
    if (labelFittingLength == formattedLabel.length()) {
        super.drawLabel(c, formattedLabel, x, yPreviousLine, anchor, angleDegrees);
    } else {
        int spaceMultipleLine = 8;
        List<String> subLabels = splitByNumber(formattedLabel, labelFittingLength);
        for (String subLabel : subLabels) {
            Utils.drawXAxisValue(c, subLabel, x, yPreviousLine, mAxisLabelPaint, anchor, angleDegrees);
            yPreviousLine = yPreviousLine + rect.height() + spaceMultipleLine;
        }
    }

}

private List<String> splitByNumber(String s, int size) {
    List<String> strings = new ArrayList<>();
    int index = 0;
    while (index < s.length()) {
        strings.add(s.substring(index, Math.min(index + size, s.length())));
        index += size;
    }
    return strings;
  }
}