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

如何在AndroidPlot柱状图的每个柱子顶部显示数值?

AndroidPlot柱状图顶部显示数值实现方案

针对你需要在柱状图柱子顶部显示对应数值的需求,这里提供两种实用的实现方式,都是基于AndroidPlot的扩展能力来完成:


方法一:自定义BarRenderer(推荐)

直接重写BarRenderer的绘制逻辑,在柱子绘制完成后追加数值文本,这种方式耦合度低,扩展性强:

1. 实现自定义Renderer类

public class LabeledBarRenderer extends BarRenderer<BarSeries> {
    private final Paint labelPaint;

    public LabeledBarRenderer(XYPlot plot) {
        super(plot);
        // 配置数值文本的样式,可根据需求调整
        labelPaint = new Paint();
        labelPaint.setTextSize(Utils.dpToPix(12, plot.getContext()));
        labelPaint.setColor(Color.BLACK);
        labelPaint.setTextAlign(Paint.Align.CENTER);
        labelPaint.setAntiAlias(true);
    }

    @Override
    protected void onRenderBar(Canvas canvas, RectF barRect, BarSeries series, int index, BarFormatter formatter) {
        // 先绘制默认的柱子
        super.onRenderBar(canvas, barRect, series, index, formatter);
        
        // 获取当前柱子对应的Y轴数值
        Number value = series.getY(index);
        if (value == null) return;
        
        // 计算文本绘制位置:柱子顶部中心,上移4dp避免贴边
        float xPos = barRect.centerX();
        float yPos = barRect.top - Utils.dpToPix(4, getPlot().getContext());
        
        // 绘制数值文本
        canvas.drawText(value.toString(), xPos, yPos, labelPaint);
    }
}

2. 在代码中替换默认Renderer

// 初始化图表和数据系列
XYPlot plot = findViewById(R.id.your_plot_id);
SimpleXYSeries dataSeries = new SimpleXYSeries(
    Arrays.asList(15, 28, 12, 35),
    SimpleXYSeries.ArrayFormat.Y_VALS_ONLY,
    "业务数据"
);
BarSeries barSeries = new BarSeries("数据组", dataSeries);

// 设置自定义Renderer
LabeledBarRenderer labeledRenderer = new LabeledBarRenderer(plot);
plot.addSeries(barSeries, new BarFormatter(Color.parseColor("#2196F3"), Color.parseColor("#E0E0E0")));
plot.setRenderer(labeledRenderer);

// 刷新图表
plot.redraw();

方法二:利用PostDraw回调快速实现

如果不想自定义Renderer,也可以通过监听图表绘制完成事件,手动计算柱子位置并绘制数值:

plot.addOnPostDrawListener(canvas -> {
    BarRenderer barRenderer = (BarRenderer) plot.getRenderer(BarSeries.class);
    if (barRenderer == null) return;

    // 遍历所有数据系列(如果有多个系列需循环处理)
    BarSeries targetSeries = (BarSeries) plot.getSeriesList().get(0);
    Paint labelPaint = new Paint();
    labelPaint.setTextSize(Utils.dpToPix(12, plot.getContext()));
    labelPaint.setColor(Color.DKGRAY);
    labelPaint.setTextAlign(Paint.Align.CENTER);
    labelPaint.setAntiAlias(true);

    for (int i = 0; i < targetSeries.size(); i++) {
        RectF barRect = barRenderer.getBarRect(i, targetSeries);
        if (barRect == null) continue;

        Number value = targetSeries.getY(i);
        if (value == null) continue;

        float x = barRect.centerX();
        float y = barRect.top - Utils.dpToPix(4, plot.getContext());
        canvas.drawText(value.toString(), x, y, labelPaint);
    }
});

额外提示

  • 可以根据UI需求调整labelPaint的字体、颜色、间距等参数
  • 如果是多组柱状图(分组Bar),需要在计算位置时考虑组内的偏移
  • 使用Utils.dpToPix可以保证文本大小在不同分辨率设备上的一致性

内容的提问来源于stack exchange,提问作者Moreno Forlani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:42:04