AChartEngine是一个安卓的图表框架,支持各种图表。以下说的针对曲线图。
百度一通没发现,然后在http://stackoverflow.com/questions/16140546/android-fill-color-below-the-line-chart
上看到有人贴出效果图:代码里面说的我没搞懂。
然后用了另一种思维方式,在曲线图表view的上面加一层渐变色的view。
一:首先下载源码,官网在http://code.google.com/p/achartengine/ 但这个要翻墙。然后我就在github下载了一份别人的copy。实在找不到我最后会贴下我修改后的源码(其实就改了一两个文件)。
二:根据使用Achartengine做平滑曲线图和温度显示柱状图里的demo,画出正常无渐变的曲线图。其中 xyRenderer.setFillBelowLine(true);表示曲线下填充颜色。
三:修改源码得到渐变色的图:
修改org.achartengine.chart.CubicLineChart类的drawPath方法:
源代码在最后一句是在画布canvas上画曲线canvas.drawPath(linePath, paint);
那我们在他画完曲线后,在画布canvas加画一个渐变色的矩形去遮盖曲线图。
下面是我多加的代码:(此处可参考Android利用canvas画各种图形 和 Adnroid上的简单图像合成类——PorterDuffXfermode)
//多画一个矩形
Paint p = new Paint();
LinearGradient lg=new LinearGradient(0,yMin,0,yMax,Color.parseColor("#00ffffff"),Color.parseColor("#BFffffff"),Shader.TileMode.CLAMP);// CLAMP重复最后一个颜色至最后
p.setShader(lg);
p.setXfermode(new PorterDuffXfermode(
android.graphics.PorterDuff.Mode.SRC_ATOP));
canvas.drawRect(0, yMin, 5000, 5000, p);// 长方形
canvas.drawPath(linePath, paint);
注意:此处阴影色都为白色,为什么呢,因为阴影的主色在我们自己项目的代码中设置(项目中的
xyRenderer.setFillBelowLine(true);
xyRenderer.setFillBelowLineColor(Color.parseColor("#3ebdff"));//chart_gradient
)。这边只是加个遮罩效果,只是这个遮罩为渐变的白色(透明)的遮罩罢了。
四:参考
将一个Android的工程打成Jar包 把源码工程打包成jar包,再替换掉步骤二中的代码里的AchartEngine.jar即可。
ps:我修改后的源码地址:http://pan.baidu.com/s/1dDjmZqL
pps:数据要为动态的网络获取的就改步骤二中的代码的drawSingleLine方法中的temperatureLists
效果图大概是这样:
-----------------------------------------------------//以下是修改XY轴样式,跟渐变色无关------------------------------------------------
另外:要修改XY轴的样式在XYChart中的draw方法的464行的if (mRenderer.isShowAxes()) {那边
其中,canvas.drawLine(left, bottom, right, bottom, paint);这句在画x轴线
所以可以看出要改XY轴在canvas这个画布上改。
我改了样式列下代码,有兴趣的看看:
if (mRenderer.isShowAxes()) {
paint.setColor(mRenderer.getXAxisColor());
canvas.drawLine(left, bottom, right+38, bottom, paint);//画x轴线
//画圆
Paint p = new Paint();
p.setColor(Color.parseColor("#78cdf9"));
p.setAntiAlias(true);// 设置画笔的锯齿效果
canvas.drawCircle(right+50, bottom, 8, p);
p.setStyle(Paint.Style.STROKE);//设置空心
p.setStrokeWidth(2);
canvas.drawCircle(right+50, bottom, 12, p);
paint.setColor(mRenderer.getYAxisColor());
boolean rightAxis = false;
for (int i = 0; i < maxScaleNumber && !rightAxis; i++) {
rightAxis = mRenderer.getYAxisAlign(i) == Align.RIGHT;
}
if (or == Orientation.HORIZONTAL) {
canvas.drawLine(left, top-38, left, bottom, paint);
//画圆
Paint p2 = new Paint();
p2.setColor(Color.parseColor("#78cdf9"));
p2.setAntiAlias(true);// 设置画笔的锯齿效果
canvas.drawCircle(left, top-50, 8, p2);
p2.setStyle(Paint.Style.STROKE);//设置空心
p2.setStrokeWidth(2);
canvas.drawCircle(left, top-50, 12, p2);
if (rightAxis) {
canvas.drawLine(right, top, right, bottom, paint);
}
} else if (or == Orientation.VERTICAL) {
canvas.drawLine(right, top, right, bottom, paint);
}
}