前言

MPAndroidChart 中,我们可以直接使用 setBackground() 来为图表设置 drawable 背景,但是这个背景会覆盖图表的全部区域,包括坐标轴和图例。

有时候,我们只想为图表区域绘制背景,不想覆盖坐标轴和图例。MPAndroidChart 提供了方法 setGridBackgroundColor() 可实现类似目的,但是,此方法只支持纯色,不支持通用的 drawable 。

所以,有没有一种方法,能够只在图表区域绘制背景,且支持 drawable 呢?

找了一圈,好像没有现成的解决方案,那就自己研究下吧。

方案

看了一下,MPAndroidChart 中使用了 contentRect 来标识实际图表区域位于整个 chart view 中的位置,因此,我们可以自己实现一个 drawable ,只在目标区域绘制背景,代码如下,以拓展函数的形式实现:

fun Chart<*>.setContentBackground(drawable: Drawable) {
    background = object : Drawable() {
        override fun draw(canvas: Canvas) {
            val paint = Paint()
            // In case you want to change the color outside the content.
            // paint.setColor(xxx)
            canvas.drawRect(bounds, paint)
            drawable.bounds = contentRect.toRect()
            drawable.draw(canvas)
        }

        override fun setAlpha(alpha: Int) {
        }

        override fun setColorFilter(colorFilter: ColorFilter?) {
        }

        override fun getOpacity(): Int {
            return PixelFormat.TRANSLUCENT
        }

    }
}

使用非常简单:

chart.setContentBackground(getDrawable(R.drawable.my_background)!!)

效果如图。

同时,注意到 github issue 中也有类似的问题,于是把解决方案也同步了过去。
https://github.com/PhilJay/MPAndroidChart/issues/1048