Android 开源柱状图分析实现
在平时开发中柱状形状偶尔会有项目需求,由于又一次开发需要,去找开源的组件都不好用,要不调用很不方便,要不它们类库太笨重,下面介绍一个轻巧方便控件,原理就是用View 重新绘画一个柱状图形控件,并适配所有屏幕。
demo实现后效果图如上
1. 导入DisplayView(简称SDK)
下载最新版sdk的zip包,解压将其中的download释放到本地目录,Eclipse用户右键您的工程根目录,选择Properties -> Java Build Path -> Libraries, 然后点击 Add External JARs... 选择指向download 的路径,点击OK,即导入成功。
下载最新版SDK的zip包,将其中的libs 文件夹合并到本地工程libs子目录下
Eclipse用户右键工程根目录,选择Properties -> Java Build Path -> Libraries,然后点击Add External JARs... 选择指向jar的路径,点击OK,即导入成功。
注意。
2.代码接入详解使用说明:
在下载代码后,里面有参考代码,代码都有注释和调用详解,先讲解ChartActivity调用类如何编写。
public class ChartActivity extends Activity { private LinearLayout layout_chart; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); // 先编写一个布局文件 this.setContentView(R.layout.layout_chart); //创建一个线性容器,之后就是向着里面嵌套视图 layout_chart = (LinearLayout) this.findViewById(R.id.lay_chart); LinearLayout.LayoutParams layParam = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layParam.gravity = Gravity.CENTER_HORIZONTAL; //创建柱状性参数对象 ChartEntity entity = new ChartEntity(); entity.scale = 6; entity.row_height = 60; entity.row_weight = 4; entity.padding_weight = 8; //创建一个纵向数据容器 ListhList = new ArrayList (); //创建一个横向数据容器,注解数据格式如:key,是否显示在横坐标 List wList = new ArrayList (); //创建一个存储高度值容器 HashMap map = new HashMap (); hList.add(0公里); hList.add(10-); hList.add(20-); hList.add(30-); entity.hList = hList; for (int i = 0; i < 30; i++) { String curStr; if ((i + 1) % 5 == 0) { curStr = (i + 1) + ,true; } else { curStr = (i + 1) + ,false; } wList.add(curStr); map.put(curStr, i * 4); } entity.wList = wList; entity.map = map; ChartView chartView = new ChartView(this.getApplicationContext(), entity); layout_chart.addView(chartView, layParam); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); }}
3.ChartEntity实体类核心代码详解:
ChartEntity是柱状图参数实体类,每个都有详解,供外部调用和修改。
/** * 柱状图形实体类 * * @author 胡少平 * */public class ChartEntity { // 每个柱形纵向数据显示集:String = 显示内容 public ListhList; // 每个柱形横向数据显示集:String = 显示内容,true|false public List wList; //横向显示值 public HashMap map; //柱形比例度 public int scale; // 每个柱形横向柱状显示宽度 public int row_weight = 0; // 每个柱形横向柱状间距 public int padding_weight = 0; //横向起始点x坐标 public int startX = 30; //每个柱形纵向显示宽度 public int row_height=0; //每个柱形纵向 public int padding_height=12; public ChartEntity() { // TODO Auto-generated constructor stub }}
4.ChartViewUI组件核心代码详解如下:
/** * * 柱状形显示UI组件 * * @author 胡少平 * */public class ChartView extends View { private ChartEntity entity; private Paint paint; // 每个柱形宽度 private int zWith = 0; private int zPadding = 0; private int startX = 0; private int totalHeight = 0; private int lineHeight = 0; private int zHeight = 0; // 横向x坐标显示个数 private int wSize = 0; // 纵向y坐标显示个数 private int hSize = 0; public ChartView(Context context, ChartEntity entity) { super(context); paint = new Paint(); paint.setAntiAlias(true); this.entity = entity; zWith = DeviceInfo.DipToPixels(this.getContext(), entity.row_weight); zPadding = DeviceInfo.DipToPixels(this.getContext(), entity.padding_weight); startX = DeviceInfo.DipToPixels(this.getContext(), entity.startX); zHeight = DeviceInfo.DipToPixels(this.getContext(), entity.row_height); totalHeight = DeviceInfo .DipToPixels(this.getContext(), entity.row_height * entity.hList.size() + entity.padding_height); lineHeight = DeviceInfo.DipToPixels(this.getContext(), entity.row_height * entity.hList.size()); wSize = entity != null && entity.wList != null && entity.wList.size() > 0 ? entity.wList.size() : 0; hSize = entity != null && entity.hList != null && entity.hList.size() > 0 ? entity.hList.size() : 0; } public void drawAxis(Canvas canvas) { //设置画笔属性 paint.setColor(Color.RED); paint.setStrokeWidth(2); paint.setTextSize(DeviceInfo.DipToPixels(this.getContext(), 12)); //用游标绘画线条 canvas.drawLine(startX, lineHeight, wSize * zWith + wSize * zPadding + startX, lineHeight, paint); canvas.drawLine(startX, 0, startX, lineHeight, paint); int x = 0; int y = 0; for (int i = 0; i < wSize; i++) { x = startX + i * zPadding + (i) * zWith; if (entity != null && entity.wList != null) { String wVal = entity.wList.get(i); String[] wArray = wVal.split(,); if (wArray[1].equals(true)) { canvas.drawText(wArray[0], x, totalHeight, paint); } } } for (int i = 0; i < hSize; i++) { y = lineHeight - i * zHeight; if (entity != null && entity.hList != null) { String wVal = entity.hList.get(i); String[] wArray = wVal.split(,); if (i == 0) { canvas.drawText(wArray[0], DeviceInfo.DipToPixels(this.getContext(), 5), y, paint); } else { //用游标绘画文本 canvas.drawText( wArray[0], startX - DeviceInfo.DipToPixels(this.getContext(), 15), y, paint); } } } } public void drawChart(Canvas canvas) { paint.setColor(Color.RED); if (entity != null && entity.wList.size() > 0) { for (int i = 0; i < wSize; i++) { int total = (int) (entity.map.get(entity.wList.get(i)) == null ? 0 : entity.map.get(entity.wList.get(i)) * entity.scale); //用游标画一个方块 canvas.drawRect((i + 1) * zPadding + (i) * zWith + startX, lineHeight - total, i * zPadding + i * zWith + startX, lineHeight, paint); } } } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int widthMode = MeasureSpec.getMode(widthMeasureSpec); final int widthSize = MeasureSpec.getSize(widthMeasureSpec); final int heightMode = MeasureSpec.getMode(heightMeasureSpec); final int heightSize = MeasureSpec.getSize(totalHeight); setMeasuredDimension(widthSize, heightSize); } @Override public void onDraw(Canvas canvas) { drawAxis(canvas); drawChart(canvas); }}
>更多相关文章
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 05-15奇安信:数据安全问题是医疗卫生行业数字化
- 05-15腾讯宣布混元文生图大模型开源
- 05-15网易云音乐与韩国知名娱乐公司Kakao达成战略
- 05-15阿联酋宣告正式开启“5G-A全国商用”计划,
- 05-15二十年未遇的强烈地磁暴来袭
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御