You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPAndroidChart开发LineChart时Y轴过长标签如何实现两行换行显示

MPAndroidChart LineChart Y轴多行标签实现方案

MPAndroidChart默认的YAxisRenderer不支持识别\n换行符,需要通过自定义Y轴渲染器实现多行标签绘制,具体实现步骤如下:

步骤1:自定义多行Y轴渲染器

重写drawYLabels方法,自动拆分带\n的标签文本,逐行计算偏移量完成绘制:

import android.graphics.Canvas;
import android.graphics.Paint;
import com.github.mikephil.charting.renderer.YAxisRenderer;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.utils.Transformer;
import com.github.mikephil.charting.utils.ViewPortHandler;

public class MultiLineYAxisRenderer extends YAxisRenderer {
    // 行间距系数,可根据UI需求调整
    private static final float LINE_SPACING_SCALE = 1.2f;
    private final Paint tempPaint = new Paint();

    public MultiLineYAxisRenderer(ViewPortHandler viewPortHandler, YAxis yAxis, Transformer trans) {
        super(viewPortHandler, yAxis, trans);
        tempPaint.set(mAxisLabelPaint);
    }

    @Override
    protected void drawYLabels(Canvas c, float fixedPosition, float[] positions, float offset) {
        for (int i = 0; i < mYAxis.getEntryCount(); i++) {
            String label = mYAxis.getEntries()[i];
            if (label == null) continue;
            // 按换行符拆分标签为多行
            String[] lineList = label.split("\n");
            float baseY = positions[i * 2 + 1] + offset;
            float lineHeight = tempPaint.getFontMetrics().bottom - tempPaint.getFontMetrics().top;
            // 逐行绘制文本
            for (int lineIndex = 0; lineIndex < lineList.length; lineIndex++) {
                float currentLineY = baseY + lineIndex * lineHeight * LINE_SPACING_SCALE;
                c.drawText(lineList[lineIndex], fixedPosition, currentLineY, mAxisLabelPaint);
            }
        }
    }
}

步骤2:为LineChart绑定自定义渲染器

如果使用左侧Y轴就绑定左侧渲染器,使用右侧Y轴则对应绑定右侧渲染器即可:

// 绑定左侧Y轴自定义渲染器
lineChart.setRendererLeftYAxis(new MultiLineYAxisRenderer(
    lineChart.getViewPortHandler(),
    lineChart.getAxisLeft(),
    lineChart.getTransformer(YAxis.AxisDependency.LEFT)
));

// 预留Y轴绘制空间,避免标签被裁切
lineChart.getAxisLeft().setMinWidth(120); // 单位:dp,可根据实际文本长度调整
lineChart.setExtraLeftOffset(30f); // 增大图表左侧留白,单位:dp
lineChart.getAxisLeft().setYOffset(8f); // 调整标签垂直偏移,避免多行文本重叠

步骤3:设置带换行符的Y轴标签

直接在标签文本中加入\n即可生效:

lineChart.getAxisLeft().setValueFormatter(new ValueFormatter() {
    @Override
    public String getFormattedValue(float value) {
        int intValue = (int) value;
        switch (intValue) {
            case 100:
                return "最高阈值\n(100ms)";
            case 50:
                return "平均阈值\n(50ms)";
            case 0:
                return "最低阈值\n(0ms)";
            default:
                return String.valueOf(intValue);
        }
    }
});

// 刷新图表使配置生效
lineChart.invalidate();

注意事项

  • 若多行标签出现垂直重叠,可适当增大YOffset数值或缩小行间距系数
  • 若标签文本被左侧边界裁切,可增大setExtraLeftOffset的数值预留足够绘制空间
  • 该方案同时兼容Kotlin项目,可直接将Java代码转换为Kotlin语法使用

内容的提问来源于stack exchange,提问作者Pepa Zapletal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:18:03