金融类或一些常规应用通常需要画折线图,无论是折线图还是直方图、散点图,都有比较成熟的第三方库来实现,其中GitHub上star最多的图表库就是philJay的MPAndroidChart,关于它的一些介绍不在本文的讨论范围,想要了解这个库的朋友可以直接去https://github.com/PhilJay/MPAndroidChart 这个地址查看。
本文要解决的问题是如何画渐变色的线。以折线为例。我们知道LineDataSet代表一条线,不难发现它有一个属性 lineDataSet.setGradientColor(startColor, endColor),如果从字面上理解,就是设置线条的渐变色,这不就是我们要的吗!然而实际测试发现,线条的颜色并没有变成渐变色,那么是什么原因呢?直观的猜测是这个方法没有实现,那么是不是呢?
循着源码,我们终于找到渲染线条的类了。在MPAndroidChart源码com/github/mikephil/charting/render/LineChartRender.java 注意到这个方法drawLinear
看里面的实现应该就是渲染线条的实现,通过第二个参数dataSet能获取应用中赋值的属性,自然包含GradientColor属性。但是纵观整个方法,都没有使用这个属性。至此,折线图设置渐变色无效的原因找到了,就是没有实现。那我们如何实现setGradientColor这个方法呢?
很简单,在canvas.drawLines(mLineBuffer, 0, size, mRenderPaint) 画线之前,加上这么一段:
if (dataSet.getGradientColor() != null)
{
GradientColor gradientColor = dataSet.getGradientColor();
mRenderPaint.setShader(
new LinearGradient(
0,
0,
0,
mChart.getHeight(),
gradientColor.getStartColor(),
gradientColor.getEndColor(),
Shader.TileMode.CLAMP));
}
重新测试,线条的颜色变成了渐变。