【问题标题】:MpAndroidChart - How to fill area between two lines on a CombinedChart?MpAndroidChart - 如何填充组合图表上两行之间的区域?
【发布时间】:2018-04-23 16:42:32
【问题描述】:

这个answer 与一个类似的问题显示了如何填充 MpAndroidChart LineChart 上两行之间的区域。

但是,我没有使用 LineChart,而是使用 CombinedChart(因为我还有条形数据要显示)。但是将上述解决方案应用于 CombinedChart 会导致此异常:

java.lang.ClassCastException: org.example.MyLineLegendRenderer 不能 被转换为 com.github.mikephil.charting.renderer.CombinedChartRenderer 在 com.github.mikephil.charting.charts.CombinedChart.setData(CombinedChart.java:96)

所以我查看了CombinedChartRenderer,但是(与LineChartRenderer 不同),它似乎不包含任何填充功能。

那么如何填充组合图表上两行之间的空间?

【问题讨论】:

    标签: android mpandroidchart


    【解决方案1】:

    您可以覆盖CombinedChartRenderer 类中的createRenderers() 方法。通过这种方式,您可以为 CombinedChart 中使用的每种类型的图表使用自己的渲染器。

    会是这样的:

    public class MyCombinedChartRenderer extends CombinedChartRenderer {
    
        public MyCombinedChartRenderer(CombinedChart chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
            super(chart, animator, viewPortHandler);
        }
    
        @Override
        public void createRenderers() {
            this.mRenderers.clear();
            CombinedChart chart = (CombinedChart)this.mChart.get();
            if (chart != null) {
                CombinedChart.DrawOrder[] orders = chart.getDrawOrder();
                CombinedChart.DrawOrder[] var3 = orders;
                int var4 = orders.length;
    
                for(int var5 = 0; var5 < var4; ++var5) {
                    CombinedChart.DrawOrder order = var3[var5];
                    switch(order) {
                        case BAR:
                            if (chart.getBarData() != null) {
                                this.mRenderers.add(new BarChartRenderer(chart, this.mAnimator, this.mViewPortHandler));
                            }
                            break;
                        case BUBBLE:
                            if (chart.getBubbleData() != null) {
                                this.mRenderers.add(new BubbleChartRenderer(chart, this.mAnimator, this.mViewPortHandler));
                            }
                            break;
                        case LINE:
                            if (chart.getLineData() != null) {
                                // replace with you own Line chart renderer
                                //this.mRenderers.add(new LineChartRenderer(chart, this.mAnimator, this.mViewPortHandler));
                                this.mRenderers.add(new MyLineChartRenderer(chart, this.mAnimator, this.mViewPortHandler));
                            }
                            break;
                        case CANDLE:
                            if (chart.getCandleData() != null) {
                                this.mRenderers.add(new CandleStickChartRenderer(chart, this.mAnimator, this.mViewPortHandler));
                            }
                            break;
                        case SCATTER:
                            if (chart.getScatterData() != null) {
                                this.mRenderers.add(new ScatterChartRenderer(chart, this.mAnimator, this.mViewPortHandler));
                            }
                    }
                }    
            }
        }
    }
    

    在上面的代码中,在遇到case LINE:switch块中,我们将默认渲染器替换为我们自己的版本:MyLineChartRenderer

    最后在您的 Activity 代码中,您可以将此渲染器与您的 CombinedChart 一起使用:

    CombinedChart combinedChart = (CombinedChart) findViewById(R.id.barChart);
    combinedChart.setRenderer(new MyCombinedChartRenderer(combinedChart, combinedChart.getAnimator(), combinedChart.getViewPortHandler()));
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多