MPAndroidChart:更改条形图的形状

Mav*_*sa9 7 android kotlin

我已经阅读了与我类似的问题的答案。但是,我不明白,我认为这太复杂了。也许你们中的一些人有一个让事情变得简单的技巧。顺便说一句,我正在使用'com.github.PhilJay:MPAndroidChart:v2.2.4'图书馆。我想制作像这张图一样的条形图样式。

条形图

矩形的角的半径约为4dp。我还没有找到任何方法来绘制它。

Via*_*lav 2

看来没有办法让它变得简单。最后我想出了一个笨拙但有效的解决方案,在我的案例中效果很好。首先将 BarChartRenderer 子类化并将其设置为您的图表:

class CustomBarRenderer constructor(
         chart: BarChart, 
         animator: ChartAnimator, 
         vpHandler: ViewPortHandler,
         cornerDimens: Float
) : BarChartRenderer(chart, animator, vpHandler)

//...
chart.renderer = CustomBarRenderer(chart, chart.animator, chart.viewPortHandler, cornersDimens)
//...

Run Code Online (Sandbox Code Playgroud)

BarChartRenderer继承mRenderPaint用于绘制条形线的成员,因此如果您需要一些轻微的修改(条形边框宽度、填充类型或其他任何内容),您可以简单地mRendererPaintinit块中覆盖,然后就可以了。

init {
    mRendererPaint = Paint().also {
        // all paint properties you need
    }
}
Run Code Online (Sandbox Code Playgroud)

但这还不足以获得圆角条。原因是渲染器使用canvas.drawRect内部drawDataSet方法绘制它们,因此我们需要更深入地重写它,并将此调用更改为canvas.drawRoundRect

override fun drawDataSet(c: Canvas, dataSet: IBarDataSet, index: Int) {

    //....
    c.drawRoundRect(
         buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
         buffer.buffer[j + 3], cornersDimen, cornersDimen, mRenderPaint
    )
    //....
}
Run Code Online (Sandbox Code Playgroud)

重要的是- 尽管大多数renderer成员都很protected容易使用或覆盖,但仍然有一些private东西用于绘制阴影。不幸的是,我不得不删除阴影渲染(首先只是因为我不需要它们),所以对于某些人来说这可能是一个不完整的解决方案。