柱形图是被使用最多的图之中的一个,在写XCL-Charts这个Android图表库时,为它花费的时间相当多,不是由于有多难绘制,而是要在设计时怎样才干保证图基类能适应各种情况,能灵活满足足够多的需求,以及够简洁的接口,并要开放出足够多的绘制元素和參数供开发者定制,同一时候对各类柱形图独有的的特点要加以突出,再加上柱形图的选项本身相对于其他图来说也是相当多的,所以花了比較多的时间。结果嘛,至少我自己临时认为还算不错。

这里我仅仅简单给大家介绍XCL-Charts图表库中柱图一个比較有意思的特点: 柱形图在使用同一数据源情况下,实现显示风格的灵活切换。

首先介绍下数据源:

XCL-Charts柱形图的数据源我将其定义的相当简单,就三大元素:

键值,数据序列,柱形颜色 

BarData(String key,List<Double> dataSeries,Integer color)

其次,看看实现风格切换:

我在图表库Demo中,举了以下这样一个样例, 对于传入的同一个数据源XCL-Charts支持在6种形式的柱形图风格间进行切换。

经过封装,在XCL-Charts中实现这个效果代码在相当少的:

/**
* Copyright 2014 XCL-Charts
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @Project XCL-Charts
* @Description Android图表基类库
* @author XiongChuanLiang<br/>(xcl_168@aliyun.com)
* @Copyright Copyright (c) 2014 XCL-Charts (www.xclcharts.com)
* @license http://www.apache.org/licenses/ Apache v2 License
* @version v0.1
*/
package com.demo.xclcharts.view; import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List; import org.xclcharts.chart.BarChart3D;
import org.xclcharts.chart.BarChart;
import org.xclcharts.chart.BarData;
import org.xclcharts.chart.StackBarChart;
import org.xclcharts.common.IFormatterDoubleCallBack;
import org.xclcharts.common.IFormatterTextCallBack;
import org.xclcharts.renderer.XEnum; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.Log; /**
* @ClassName SpinnerBarChart01View
* @Description 柱形图同数据源不同柱形图切换的样例
* @author XiongChuanLiang<br/>(xcl_168@aliyun.com)
*/
public class SpinnerBarChart01View extends GraphicalView { private String TAG = "SpinnerBarChart01View"; private int mChartStyle = 0;
private int mOffsetHeight = 0;
private BarChart mChart = null;
//标签轴
private List<String> chartLabels = new LinkedList<String>();
private List<BarData> chartData = new LinkedList<BarData>(); public SpinnerBarChart01View(Context context,int chartStyle,int offsetHeight) {
super(context);
// TODO Auto-generated constructor stub mChartStyle = chartStyle;
mOffsetHeight = offsetHeight;
chartLabels();
chartDataSet();
chartRender();
} private void initChart(int chartStyle)
{
switch(chartStyle)
{
case 0: //竖向柱形图
mChart = new BarChart();
//图例
mChart.getLegend().setLeftLegend("百分比");
break;
case 1: //横向柱形图
mChart = new BarChart();
mChart.setChartDirection(XEnum.Direction.HORIZONTAL);
break;
case 2: //竖向3D柱形图
mChart = new BarChart3D();
break;
case 3: //横向3D柱形图
mChart = new BarChart3D();
mChart.setChartDirection(XEnum.Direction.HORIZONTAL);
break;
case 4: //竖向堆叠柱形图
mChart = new StackBarChart();
((StackBarChart) mChart).setTotalLabelVisible(false);
break;
case 5: //横向堆叠柱形图
mChart = new StackBarChart();
mChart.setChartDirection(XEnum.Direction.HORIZONTAL);
((StackBarChart) mChart).setTotalLabelVisible(false);
break;
} } public void chartRender()
{
try { initChart(mChartStyle); //图所占范围大小
mChart.setChartRange(0.0f, mOffsetHeight, getScreenWidth(),getScreenHeight() - mOffsetHeight); if(mChart.isVerticalScreen())
{
mChart.setPadding(5, 40, 10, 15);
}else{
mChart.setPadding(10, 45, 15, 15);
} //数据源
mChart.setDataSource(chartData);
mChart.setCategories(chartLabels); //数据轴
mChart.getDataAxis().setAxisMax(100);
mChart.getDataAxis().setAxisMin(0);
mChart.getDataAxis().setAxisSteps(20); //定义数据轴标签显示格式
mChart.getDataAxis().setLabelFormatter(new IFormatterTextCallBack(){ @Override
public String textFormatter(String value) {
// TODO Auto-generated method stub
Double tmp = Double.parseDouble(value);
DecimalFormat df = new DecimalFormat("#0");
String label = df.format(tmp).toString();
return label+"%";
} });
//定义柱形上标签显示格式
mChart.getBar().setItemLabelVisible(true);
mChart.getBar().getItemLabelPaint().setColor((int)Color.rgb(72, 61, 139));
mChart.getBar().getItemLabelPaint().setFakeBoldText(true); mChart.setItemLabelFormatter(new IFormatterDoubleCallBack() {
@Override
public String doubleFormatter(Double value) {
// TODO Auto-generated method stub
DecimalFormat df=new DecimalFormat("#0");
String label = df.format(value).toString();
return label+"%";
}});
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e(TAG, e.toString());
}
}
private void chartDataSet()
{
//标签相应的柱形数据集
List<Double> dataSeriesA= new LinkedList<Double>();
dataSeriesA.add(50d);
dataSeriesA.add(25d);
dataSeriesA.add(20d);
BarData BarDataA = new BarData("Google",dataSeriesA,(int)Color.rgb(73, 135, 218)); List<Double> dataSeriesB= new LinkedList<Double>();
dataSeriesB.add(35d);
dataSeriesB.add(65d);
dataSeriesB.add(75d);
BarData BarDataB = new BarData("Baidu",dataSeriesB,(int)Color.rgb(224, 4, 0)); List<Double> dataSeriesC= new LinkedList<Double>();
dataSeriesC.add(15d);
dataSeriesC.add(10d);
dataSeriesC.add(5d);
BarData BarDataC = new BarData("Bing",dataSeriesC,(int)Color.rgb(255, 185, 0)); chartData.add(BarDataA);
chartData.add(BarDataB);
chartData.add(BarDataC);
} private void chartLabels()
{
chartLabels.add("路人甲");
chartLabels.add("路人乙");
chartLabels.add("路人丙");
} @Override
public void render(Canvas canvas) {
try{
mChart.render(canvas);
} catch (Exception e){
Log.e(TAG, e.toString());
}
}
}

6种图各有各的特点,但在上面代码却能够看到,在XCL-Charts中使用柱形图是件很easy的事,甚至有没这样的感觉,传入数据轴和标签轴数据源的代码,比设置画图属性的代码很多其它? 当然代码少不代表效果阳春白雪。

效果图例如以下:

  

  

上面这些图仅仅是用最简单的方式展示了下柱形图风格的切换,这个样例并没有展示XCL-Charts灵活的定制性。而图表库在设计时,

花时间最多的就是在其定制性上,由于我觉得图表库主要就是封装绘制图表时其本身的位置计算,逻辑处理等详细过程,而其他一切

參数与绘制元素都应当是可供定制的。所以XCL-Charts中画图相关的各个元素和參数,差点儿都开放出来供用户定制,在这就不细说了。

当然假设你留意下样例中的代码,也能够看出一部份特点来. 我把图中相关元素分别单立封装成了一个个类,如轴分为数据轴和标签轴,

用于管理轴各自相关的一切属性。而柱形则归于bar这个类去处理。 而对于标签文字的显示等,则採用回调函数的方式开放出来,让用户自己定义格式,

当然,不实现回调也没关系,会按默认的显示风格显示。

只是我也不是蛮干,啥都自定义,在有些地方能够看到,我开放了Canvas的Paint画笔对象出来,这样用户能够直接操控Android本身的画笔对象类,利用Android自己的函数和属性来定制效果,即够灵活,我也省事。嘿嘿.

这个样例中显露的也仅仅是一点点功能而已,远不止这点功能。感兴趣的能够自己去下代码,看下我写的Demo。

另外再提一句,XCL-Charts是利用Android Canvas相关的函数来绘制图表,相比于调用Web的各类js图表库来说,是具有原生优势的。假设有

图表需求的,能够来尝试尝试。

 XCL-Charts是开源的,基于Apache v2 License开源协议

开源中国收录的项目地址:

         http://www.oschina.net/p/xcl-charts



       代码分别托管在开源中国和GitHub上:

    开源中国上的代码托管地址:

           https://git.oschina.net/xclcharts/XCL-Charts



        GitHub上的代码托管地址:

           https://github.com/xcltapestry/XCL-Charts

对这个库感兴趣的能够关注下。

还有就是我前几天才公布的这个图表库,仅仅在CSDN自己博客发了篇通知和EOE论坛上发了个,没想到关注的人蛮多的,还有网友留言支持。真没想到,在这谢谢了。

个人觉得,Android图表事实上是个非常小众的功能需求,当时折腾仅仅是纯兴趣。假设有留意我前段时间的博文就知道,当时事实上仅仅是学Canvas时觉得好玩,尝试实现了下在上面绘制各种图,没想到折腾出来的这东东整理整理还算有点用。

特别是要谢谢开源中国,其代码托管速度蛮快的,另外收录的也非常快,我看了下,在"Android UI 组件"类别下的第4页就能找到了,在https://git.oschina.net/explore也上了推荐。

当然眼下要完好的东东还有非常多, 总之有人关注就有了继续弄的动力,哈哈。

MAIL: xcl_168@aliyun.com

Blog:http://blog.csdn.net/xcl168

XCL-Charts图表库中柱形图的同源风格切换介绍的更多相关文章

  1. 手把手教你实现折线图之------安卓最好用的图表库hellocharts之最详细的使用介绍

    因为项目需要搞一个折线图,按照日期显示相应的成绩,所以有了本文. 以前用过一次XCL-chart,但是感觉只适合固定图表,不去滑动的那种,因为你一滑动太卡了你懂得(毕竟作者好久没更新优化了),拙言大神 ...

  2. 手绘风格的 JS 图表库:Chart.xkcd

    本文作者:HelloGitHub-kalifun 图表库千万个今天 HelloGitHub 给大家推荐个很有"特色"的图表库:一个手绘风格的 JS 图表库 -- Chart.xkc ...

  3. iOS图表库Charts集成与使用

    Charts是一个很优秀的图表库,它支持Android.iOS.tvOS和macOS,这样使用起来,可以节省学习成本,可以从GitHub上了解更多信息.本文记录在iOS项目上的集成与使用. Chart ...

  4. ECharts(Enterprise Charts 商业产品图表库)初识

    一.简介 大数据时代,重新定义图表的时候到了,所以随之ECharts就随之出现了. ECharts(Enterprise Charts 商业产品图表库) 是基于Canvas的,纯Javascript ...

  5. Ember Charts – 基于 Ember & D3 的图表库

    Ember Charts 是一个基于 Ember.js 和 D3.js 的图表库.它包括时间序列.柱状图.饼图.点图,很容易扩展和修改.这些图表组件代表图表交互性和演示的最佳实践,是高度可定制和可扩展 ...

  6. 基于html5 Canvas图表库 : ECharts

    ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算.数据视图.值 ...

  7. ECharts-基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表

    ECharts http://ecomfe.github.com/echarts 基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算 ...

  8. 11个很棒的 jQuery 图表库

    如果你曾经使用过任何类型的数据,你应该知道阅读一排排数据的痛苦.通过所有这些数据弄清楚他们的意思是非常不容易的.可视化对于解决这个问题起到了重要的作用.可视化降低了数据阅读的难度,帮助决策者获得可操作 ...

  9. 最牛逼android上的图表库MpChart(三) 条形图

    最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...

随机推荐

  1. BZOJ 1037: [ZJOI2008]生日聚会Party( dp )

    dp(i, j, a, b)表示选了i个男生, j个女生, 后缀中男生比女生多a(最多), 女生比男生多b(最多). dp(i+1, j, a+1, max(0, b-1)) += dp(i, j, ...

  2. Python: how to public a model

    1, Create a folder fileFolder 2, create a file tester.py 3, create another file setup.py: The conten ...

  3. poj 3270 置换

    poj 置换的应用 黑书原题P248 /** 题意: 给定序列, 将其按升序排列, 每次交换的代价是两个数之和, 问代价最小是多少 思路:1.对于同一个循环节之内的,肯定是最小的与别的交换代价最小 2 ...

  4. IIS7内建账号,应用程序池

    在IIS7以前的IIS版本中有一个本地帐号,是在安装时创建的,叫做 IUSR_MachineName.一旦启用匿名身份认证,这个IUSR_MachineName帐号就是IIS默认使用的身份(ident ...

  5. Java—异常处理总结

    异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...

  6. java selenium webdriver实战 seleniumIDE

    Selenium是ThoughtWorks公司,一个名为Jason Huggins的测试为了减少手工测试的工作量,自己实现的一套基于Javascript语言的代码库 使用这套库可以进行页面的交互操作, ...

  7. 如何使用picasso 对Android图片下载缓存

    相比较其他,picasso的图片缓存更加简单一些,他只需要一行代码就可以表述:导入相关jar包 Picasso.with(context).load("图片路径").into(Im ...

  8. JPEGOPTIM压缩优化

    有关JPEGOPTIM JPEGOPTIM是CDN供应商Akamai开发的一个图片人优化的开源小工具. 它有较好的图片压缩效果(压缩比.图片质量), 比PHP的GD库算法要好. 详细的介绍可以看这个文 ...

  9. listview 的onitemlongclick阿和onitemclick冲突,item中还有button的点击事件

    listview里面item有button的,button要设置 android:focusable="false"  ,listview里面如果设置了 onitemlongcli ...

  10. Ubuntu下安装Wine&WineQQ+Phpstorm+wps+svn+vim(计划任的使用)+flashplayer+curl扩展

    一.安装Wine 1.添加PPA sudo add-apt-repository ppa:ubuntu-wine/ppa 2.更新列表 sudo apt-get update 3.安装Wine sud ...