MpAndroidChart - Как заполнить область между двумя линиями на CombinedChart?

1

Этот ответ по аналогичному вопросу показывает, как заполнить область между двумя строками в MpAndroidChart LineChart.

Однако, вместо использования LineChart, я использую CombinedChart (так как у меня также есть данные бара). Но применение этого решения к CombinedChart приводит к этому исключению:

java.lang.ClassCastException: org.example.MyLineLegendRenderer не может быть брошенным в com.github.mikephil.charting.renderer.CombinedChartRenderer         at com.github.mikephil.charting.charts.CombinedChart.setData(CombinedChart.java:96)

Итак, я просмотрел CombinedChartRenderer, но (в отличие от LineChartRenderer), он не содержит никаких функций для заполнения.

Итак, как я могу заполнить пробел между двумя строками в CombinedChart?

Теги:
mpandroidchart

1 ответ

1
Лучший ответ

Вы можете переопределить метод createRenderers() в классе CombinedChartRenderer. Таким образом, вы можете использовать собственный рендерер для каждого графика, который вы используете в своем 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));
                        }
                }
            }    
        }
    }
}

В приведенном выше коде в блоке switch, когда встречается case LINE:, мы заменяем рендеринг по умолчанию своей собственной версией: MyLineChartRenderer.

Затем, наконец, в вашем коде активности вы можете использовать этот рендерер с помощью CombinedChart:

CombinedChart combinedChart = (CombinedChart) findViewById(R.id.barChart);
combinedChart.setRenderer(new MyCombinedChartRenderer(combinedChart, combinedChart.getAnimator(), combinedChart.getViewPortHandler()));
  • 0
    Наконец, чтобы заполнить область между двумя (горизонтальными линиями Безье), посмотрите мой ответ на этот другой вопрос SO: stackoverflow.com/a/50118570/1617737

Ещё вопросы

Сообщество Overcoder
Наверх
Меню