MpAndroidChart - 如何填充 CombinedChart 上两条线之间的区域?
MpAndroidChart - How to fill area between two lines on a CombinedChart?
这个 到一个类似的问题显示了如何填充 MpAndroidChart LineChart.
上两条线之间的区域
但是,我没有使用 LineChart,而是使用 CombinedChart(因为我还有要显示的条形数据)。但是将上述解决方案应用于 CombinedChart 会导致此异常:
java.lang.ClassCastException: org.example.MyLineLegendRenderer cannot
be cast to com.github.mikephil.charting.renderer.CombinedChartRenderer
at com.github.mikephil.charting.charts.CombinedChart.setData(CombinedChart.java:96)
所以我看了CombinedChartRenderer but (unlike LineChartRenderer),它似乎不包含任何填充功能。
那么如何在 CombinedChart 的两条线之间填充 space?
您可以覆盖 CombinedChartRenderer
class 中的 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()));
这个
但是,我没有使用 LineChart,而是使用 CombinedChart(因为我还有要显示的条形数据)。但是将上述解决方案应用于 CombinedChart 会导致此异常:
java.lang.ClassCastException: org.example.MyLineLegendRenderer cannot be cast to com.github.mikephil.charting.renderer.CombinedChartRenderer at com.github.mikephil.charting.charts.CombinedChart.setData(CombinedChart.java:96)
所以我看了CombinedChartRenderer but (unlike LineChartRenderer),它似乎不包含任何填充功能。
那么如何在 CombinedChart 的两条线之间填充 space?
您可以覆盖 CombinedChartRenderer
class 中的 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()));