今天分享一个自定义的图表控件。其实这是以前做一个项目的时候写的,当时也想过在网上找一些开源的图表库直接用就行了,但是实在没有找到符合要求的(主要是UI要求),另外网上的开源图表库实在是太强大了,例如什么HelloChart之类的,我实在是用不上了,就算要用我也得重画UI。那个时候我又想起了一句话:“不要重复做同一个轮子”... 于是这两个想法就在激烈碰撞,然后我纠结了一小会,又想起了一句话:“不要做全能函数,要做尽可能功能单一的函数”...嗯...好吧,最后我还是放弃了各种强大的开源图表库,自己动手写了一个...
然后,最近做毕设,也是做一个android应用,需要用到图表,于是就把这个东西翻出来,并且重构了一下(其实差不多相当于重写了,因为之前写得太糟糕了-o(╯□╰)o)... 然后拿出来分享分享- -
先贴代码链接吧o(╯□╰)o SimpleChart github地址
然后贴几张效果图吧o(╯□╰)o
嗯...其实折线图那里还有一个y轴动画的,先不贴了,搞动图太累了o(╯□╰)o
看了上面这些效果图之后,应该也可以看出,SimpleChart是可以支持多数据绘制的,也就是折线图可以绘制多条线,柱状图可以绘制多条柱子~~~ 其实,还有一个特色,效果图没有展示出来,那就是折线图的不同线的数据个数可以不一样呢~~~
SimpleChart在使用上也是比较简单方便的。下面给出折线图的示例代码。
chart = (LineChart) findViewById(R.id.chart); final ArrayList<Float> y1 = new ArrayList<>(); final ArrayList<Float> y2 = new ArrayList<>(); final ArrayList<String> x = new ArrayList<>(); float j=0; for (float i=21;i>=0;i--) { x.add(String.valueOf(j)); j++; y1.add(i); y2.add(i*2); } final ArrayList<String> legends = new ArrayList<>(); final ArrayList<Integer> colors = new ArrayList<>(); legends.add("1 hello, Charts!"); legends.add("2 hello, Charts!"); colors.add(R.color.default_main_color); colors.add(R.color.chart_deep_blue); chart.setYAxisValuesFormatter(new Chart.YAxisValueFormatter() { @Override public String YvaluesString(float v) { return (int)v + "-"; } }); chart.setTheme(ChartTheme.THEME_DARK); chart.setAdapter(new LineChartAdapter() { @Override public int getLineCount() { return 2; } @Override public ArrayList<Float> getLineData(int index) { if (index == 0) return y1; else return y2; } @Override public int getLineColor(int index) { return colors.get(index); } @Override public int getXLabelsCount() { return x.size(); } @Override public String getXLabel(int position) { return x.get(position); } @Override public int getLegendCount() { return 2; } @Override public String getLegend(int position) { return legends.get(position); } @Override public int getColorId(int position) { return colors.get(position); } });基本上就和android原生的什么listView之类的一样的使用方法了,因为它在设计上使用的就是适配器模式嘛,“Adapter在手,天下我有”的赶脚哈哈哈O(∩_∩)O~~
这次就先分享效果和代码,下一次会详细解析一下代码怎么实现的~