1.写在前面
我很纠结着标题该怎么取,因为对于这个图表框架我只使用了linechart,但是用的非常非常的多,公司很多地方都是折线图。因为项目有关折线图的功能基本都完了,所以抽出一部分东西出来记录下来。这里抽出的效果图如下:
领导具体的要求有这么几点:
1. 第一个折线图表示实时功率,后面的月 年 总体都是发电量,并且日实时功率要充满(就是fill),其他的不用;
2. 日实时功率图表中X轴的值表示一天24小时,月发电量X轴表示30天或者31或者其他反正单位是天,年和总体同理,一个是12个月,一个是年。
3. 点击的Markview要和Web端一样,就是我折线图上的点击出现相应的X Y轴上的值;
然后UI就摔给我这张差不多的设计图,最后做出这样子,现在抽出来,做出的demo如下
2.步骤
A.分析
对于上面的要求分析下来可以知道:图表还是那个图表,不用初始化View好几次,只是数据变化了,就和recyclerview一样,我们只是需要改变数据源然后刷新界面就可以了,刚好提供图表库的大牛也是这样设计的,所有的方法都有。然后对于X轴上的值的显示,我们知道所有的折线图都是由点组成的,这个点是用Entry表示的,然后折线图也就是一组(X,Y),但是我们获取到这点Entry的对象时可以发现(用过这个框架的人知道),对于他的构造方法并不能直接把我们想要X轴上的值构造出来,举个例子,这折线图上不是有这样的一个点(10:40,99788),我们用这个去构造Entry那绝对不行的,来看看它提供的这些构造方法
/**
* A Entry represents one single entry in the chart.
*
* @param x the x value
* @param y the y value (the actual value of the entry)
*/
public Entry(float x, float y) {
super(y);
this.x = x;
}
/**
* A Entry represents one single entry in the chart.
*
* @param x the x value
* @param y the y value (the actual value of the entry)
* @param data Spot for additional data this Entry represents.
*/
public Entry(float x, float y, Object data) {
super(y, data);
this.x = x;
}
其他的不列出来了,太多了,反正是没有(String x,String y)或者(String x,float y)这种的。当然它提供了其他方法来完成我们想要达到的效果,方法有很多,但是我使用的是ValuesFormat这种,因为其他的我试了下,如果不切换数据,还是可以,数据切换有问题。
对于最后一点要求,这个框架的demo中提供了简单版本的方法,但是还不够,需要我们在这个基础上修改。
B.使用
1.很多简单的api(如下)我就不解释了,
Description description = lineChart.getDescription();
description.setYOffset(10);
description.setEnabled(true);
description.setText("时间");
用中文解释可能说不清楚并且你也不知道我说的对不对。对于这种api的学习很简单,首先把MPAndroidChart
中demo方法全部试一遍,true改成flase,10改成30等等这样的,看看有什么变化,然后点击进去看看它给方法写的注释,最后不行去wiki看看或者google,我基本都是这样的,感觉这样挺不错的。
2.布局不贴了,等下我留个地址并且很多地方都注释了的,很清楚。直接上linechart的初始化
/**
* 初始化折线图
*/
private void initChartView() {
lineChart = (LineChart) this.findViewById(R.id.linechart);
//在点击高亮值时回调
lineChart.setOnChartValueSelectedListener(this);
//设置整个图表的颜色
lineChart.setBackgroundResource(R.drawable.bg_line_chart);
Description description = line