自定义view柱状图
来源:互联网 发布:软件工程质量控制措施 编辑:程序博客网 时间:2024/05/17 01:45
简单的柱状图的绘制
第一步,设置画笔
首先确定需要画几个部分。需要几个画笔
本文介绍的是画3个部分。1,轴线 2,轴坐标值 3.柱子
1.初始化画笔
private Paint paint = null; //柱的画笔 private Paint labelPaint = null; //x轴线画笔 private Paint textPaint = null; //x轴坐标轴画笔 paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.BLACK); paint.setStrokeWidth(0f); paint.setStyle(Paint.Style.FILL_AND_STROKE); labelPaint = new Paint(); labelPaint.setColor(Color.BLACK); labelPaint.setStrokeWidth(2); labelPaint.setAntiAlias(true); labelPaint.setStyle(Paint.Style.STROKE); textPaint = new Paint(); textPaint.setTextSize(28); textPaint.setStyle(Paint.Style.FILL); textPaint.setColor(Color.rgb(153, 153, 153));
2.画x轴线
private float Y0; //x轴的坐标高度 private float X; //宽度 private void drawLableLine(Canvas canvas) { Path path = new Path(); path.moveTo(0f,Y0); path.lineTo(X,Y0); canvas.drawPath(path, labelPaint); }3.画x轴坐标值
private String[] xAxisFormarts = {"宏盛","松江","新梅","深圳","华夏"}; //x轴坐标值 private float barWidth = 112; //柱子的宽度 private float spaceWidth; //柱子之间的空隙宽度 private void drawLableText(Canvas canvas) { for(int i = 0 ; i < xAxisFormarts.length ; i++){ float dis = textPaint.measureText(xAxisFormarts[i]);//文本长度 float x = spaceWidth * (i + 1) + barWidth * i + (barWidth - dis)/2; canvas.drawText(xAxisFormarts[i],x,Y-5,textPaint); } }4.画柱子
private void drawBarLines(Canvas canvas) { Path path = new Path(); for(int i = 0 ; i < data.size() ; i++){ path.reset(); path.moveTo(spaceWidth * (i + 1) + barWidth * i,Y0); path.lineTo(spaceWidth * (i + 1) + barWidth * i,((maxValue - data.get(i))/maxValue) * BarMaxHeight); path.lineTo(spaceWidth * (i + 1) + barWidth * (i + 1) ,((maxValue - data.get(i))/maxValue) * BarMaxHeight ); path.lineTo(spaceWidth * (i + 1) + barWidth * (i + 1) ,Y0); if(data.get(i) > averageValue){ paint.setColor(Color.rgb(239, 83, 80)); //red 值高于分割线以上显示柱子为红色,低于则灰色 }else{ paint.setColor(Color.rgb(153, 153, 153)); //gray } canvas.drawPath(path, paint); } }
整体代码如下:
package com.zhuhao.finance.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.View;import java.util.ArrayList;/** * Created by gaoli on 2017/7/17. */public class BarLine extends View { private Paint paint = null; //柱的画笔 private Paint labelPaint = null; //x轴线画笔 private Paint textPaint = null; //x轴坐标轴画笔 private float barWidth = 112; //柱子的宽度 private float spaceWidth; //柱子之间的空隙宽度 private float textHeight = 32; //给x轴坐标值 留的高度 private float BarMaxHeight; //最大的柱高度 private float Y; //高度 private float X; //宽度 private float Y0; //x轴的坐标高度 private boolean isShowXText = true; //是否显示x轴坐标值 private ArrayList<Float> data = new ArrayList<Float>(); //各值 private float maxValue = 5; //数据最大值 private float averageValue = 4; //数据分割线值 private String[] xAxisFormarts = {"宏盛","松江","新梅","深圳","华夏"}; //x轴坐标值 public BarLine(Context context) { super(context); init(); } public BarLine(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public BarLine(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init(){ paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.BLACK); paint.setStrokeWidth(0f); paint.setStyle(Paint.Style.FILL_AND_STROKE); labelPaint = new Paint(); labelPaint.setColor(Color.BLACK); labelPaint.setStrokeWidth(2); labelPaint.setAntiAlias(true); labelPaint.setStyle(Paint.Style.STROKE); textPaint = new Paint(); textPaint.setTextSize(28); textPaint.setStyle(Paint.Style.FILL); textPaint.setColor(Color.rgb(153, 153, 153)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawLableLine(canvas);//x轴线 drawLableText(canvas);//x轴值 drawBarLines(canvas);//柱子 } private void drawBarLines(Canvas canvas) { Path path = new Path(); for(int i = 0 ; i < data.size() ; i++){ path.reset(); path.moveTo(spaceWidth * (i + 1) + barWidth * i,Y0); path.lineTo(spaceWidth * (i + 1) + barWidth * i,((maxValue - data.get(i))/maxValue) * BarMaxHeight); path.lineTo(spaceWidth * (i + 1) + barWidth * (i + 1) ,((maxValue - data.get(i))/maxValue) * BarMaxHeight ); path.lineTo(spaceWidth * (i + 1) + barWidth * (i + 1) ,Y0); if(data.get(i) > averageValue){ paint.setColor(Color.rgb(239, 83, 80)); //red }else{ paint.setColor(Color.rgb(153, 153, 153)); //gray } canvas.drawPath(path, paint); } } private void drawLableText(Canvas canvas) { for(int i = 0 ; i < xAxisFormarts.length ; i++){ float dis = textPaint.measureText(xAxisFormarts[i]);//文本长度 float x = spaceWidth * (i + 1) + barWidth * i + (barWidth - dis)/2; canvas.drawText(xAxisFormarts[i],x,Y-5,textPaint); } } private void drawLableLine(Canvas canvas) { Path path = new Path(); path.moveTo(0f,Y0); path.lineTo(X,Y0); canvas.drawPath(path, labelPaint); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { spaceWidth =( w- barWidth * 5 ) / 6; BarMaxHeight = h - textHeight; Y = h; X = w; Y0 = h - textHeight; postInvalidate(); super.onSizeChanged(w, h, oldw, oldh); } public void setBarWidth(float barWidth) { this.barWidth = barWidth; } public void setShowXText(boolean showXText) { if(!showXText){ this.textHeight = 0; } } public void setMaxValue(float maxValue) { this.maxValue = maxValue; } public void setData(ArrayList<Float> data) { this.data = data; } public void setAverageValue(float averageValue) { this.averageValue = averageValue; } public void setTextHeight(float textHeight) { this.textHeight = textHeight; }}
activity调用:
private void initBarLine() { ArrayList<Float> data = new ArrayList<>(); data.add(30f); data.add(20f); data.add(15f); data.add(35f); data.add(60f); barChart.setData(data); barChart.setTextHeight(32f); barChart.setBarWidth(112f); barChart.setMaxValue(60f); barChart.setAverageValue(40f); barChart.invalidate(); }
阅读全文
0 0
- 自定义view之柱状图
- 自定义View之柱状图
- 自定义view柱状图
- 自定义view-3d柱状图
- Android自定义View写柱状图
- 自定义View实例(四)----自定义条形柱状图
- Android 如何 画 柱状图 -------自定义View
- [AndroidUI]自定义view(五):实现动态柱状图
- Android 自定义View之柱状图实践
- 【Android】自定义View -- 条形图(柱状图)
- Android自定义View(三)柱状图
- 28 自定义View画坐标和柱状图
- Android自定义View——柱状图
- 自定义view:快速实现柱状图的绘制
- 二、关于自定义view的文章:柱状图
- 自定义View-轻量级柱状图、饼图、折线图
- Android 自定义view实现动态柱状图。
- Android自定义View柱状图数据分析器
- bzoj3887 [Usaco2015 Jan]Grass Cownoisseur tarjan+拓补排序
- MP算法和OMP算法及其思想
- opencv学习笔记之Mat::at
- grep查找避开二进制文件
- spring boot自定义属性配置
- 自定义view柱状图
- Linux下安装LoadRunner LoadGenerator
- Maven快照机制(SNAPSHOT)
- 生动形象的描述并查集(转)
- Qt QPainter动态进度条[根据值大小改变进度]
- Codeforces Round #420 (Div. 2) 821D Okabe and City 思维建图+dij
- 上海磐启微电子面试经验分享
- Glide加载网络图片报404问题
- ....Fragment must be a public static class to be properly recreated from instance state.