【问题标题】:Custom position for bar values条形值的自定义位置
【发布时间】:2017-01-03 13:25:10
【问题描述】:

我正在使用MPAndroidChart 库来创建条形图。

我们可以使用以下来在条形图的顶部显示条形图的值。

mChart.setDrawValueAboveBar(false);

或者我们可以使用这个:

barDataSet.setDrawValues(true);

在条形本身内显示条形值。 我想知道我们是否可以为这些值设置自定义位置。例如在 y 轴下方。

解决方案

public class TextBarChartRenderer extends BarChartRenderer {

    public TextBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
        super(chart, animator, viewPortHandler);
    }

    @Override
    public void drawValues(Canvas c) {
        List<IBarDataSet> dataSets = mChart.getBarData().getDataSets();

        final float valueOffsetPlus = Utils.convertDpToPixel(22f)
        float negOffset;

        for (int i = 0; i < mChart.getBarData().getDataSetCount(); i++) {

            IBarDataSet dataSet = dataSets.get(i);
            applyValueTextStyle(dataSet);
            float valueTextHeight = Utils.calcTextHeight(mValuePaint, "8");
            negOffset = valueTextHeight + valueOffsetPlus;

            BarBuffer buffer = mBarBuffers[i];

            float left;
            float right;
            float top;
            float bottom;

            for (int j = 0; j < buffer.buffer.length * mAnimator.getPhaseX(); j += 4) {

                left = buffer.buffer[j];
                right = buffer.buffer[j + 2];
                top = buffer.buffer[j + 1];
                bottom = buffer.buffer[j + 3];

                float x = (left + right) / 2f;

                if (!mViewPortHandler.isInBoundsRight(x))
                    break;

                if (!mViewPortHandler.isInBoundsY(top) || !mViewPortHandler.isInBoundsLeft(x))
                    continue;

                BarEntry entry = dataSet.getEntryForIndex(j / 4);
                float val = entry.getY();

                if(val > 0) {
                    drawValue(c, dataSet.getValueFormatter(), val, entry, i, x,
                            (bottom + negOffset),
                            dataSet.getValueTextColor(j / 4));
                }
            }
        }

    }
}

还必须添加它以便值可见

mChart.setExtraOffsets(0, 0, 0, 20);

【问题讨论】:

    标签: android mpandroidchart


    【解决方案1】:

    API 中没有公开方法来将值标签的位置更改为 Y 轴下方。您可能需要扩展和修改库以满足您不常见的需求。

    尝试的一个选项是在 XAxis 上实现 IAxisValueFormatter 以呈现 y 值而不是 x 值。一个简单的例子可以重用现有的IndexAxisValueFormatter。假设您在名为yLabelsString [] 中有y 值的标签。您现在可以这样做:

    mChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(yLabels));
    

    如果这不起作用,您将不得不查看BarChartRenderer 的源代码。有一个方法叫drawValues(),你可以重写它来达到你想要的效果。

    所以你会有类似的东西:

    public class MyBarChartRenderer extends BarChartRenderer {
    
        //TODO: a constructor matching the superclass
    
        @Override
        public void drawValues(Canvas c) {
            //TODO: copy and paste the code from the superclass and simply
            //change the offset for drawing the labels
        }
    }
    

    【讨论】:

    • 我尝试了 IAxisValueFormatter,我可以在 x 轴上显示 yValue,但它们与实际的 xValues 标签相邻。我无法显示一个低于另一个的值。接下来我将尝试覆盖 drawValues() 方法。谢谢。
    • @amarok 太棒了!有覆盖渲染函数herehere的示例
    • 成功了。我已经发布了我的代码。感谢您的所有帮助:)
    • @amarok 太好了。做得好!如果需要,您可以将其发布为答案。然后接受你的回答
    • 这个关于如何编写自定义渲染器的问题:stackoverflow.com/q/43443787
    【解决方案2】:

    在 MPAndroidCharts 的 3.1.0 版中,设置 mChart.setDrawValueAboveBar(false); 将在栏顶部下方绘制值。

    【讨论】:

    • @AnirbanDas,也许你有另一个设置覆盖setDrawValueAboveBar。检查他们的示例并创建一个非常基本的图表并进行测试。还要检查您是否使用的是最新版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2017-01-15
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多