1. 程式人生 > >自定義簡單的柱狀圖

自定義簡單的柱狀圖

本人是個android菜鳥,因為專案需要所以寫了個簡單的柱狀圖,為了自己以後的學習的積累決定寫下來,都說好記性不如爛筆頭啊,好了正式開始先上個圖吧!這裡寫圖片描述

//座標軸的軸線畫筆
private Paint xLinePain;
//座標軸水平虛線畫筆
private Paint hLinePain;

//繪製左側文字的畫筆
private Paint titlePain;
//繪製右側文字的畫筆
private Paint rtitlePain; 
//左矩形畫筆
private Paint lpaint;
//矩形畫筆
private Paint rpaint;
//顯示柱狀圖的條數
private int
[] progress = {230, 200}; //實現左側動畫的值 private int[] laniProgress; //右側動畫的值 private int[] raniProgress; //在柱狀圖上顯示數字 private final int TRUE = 1; //設定點選事件,顯示哪一條柱狀資訊 private int[] text; private Bitmap bitmap; //座標軸左側的數標 private String[] ySteps; //座標右側的數標 private String[] rSteps; //座標軸底部的年月 private String[] xyear; //是否使用動畫
private int flag; public HistogramView(Context context) { super(context); init(); } public HistogramView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { ySteps = new String[]{"250", "200", "150", "100", "50", "0"}; rSteps = new String[]{"6"
, "5", "4", "3", "2", "1", "0"}; xyear = new String[]{"2016年"}; text = new int[]{0, 0}; laniProgress = new int[]{230}; raniProgress = new int[]{5}; xLinePain = new Paint(); hLinePain = new Paint(); titlePain = new Paint(); rtitlePain = new Paint(); lpaint = new Paint(); rpaint = new Paint(); //給畫筆設定顏色 xLinePain.setColor(Color.DKGRAY); hLinePain.setColor(Color.LTGRAY); titlePain.setColor(Color.BLACK); lpaint.setColor(getResources().getColor(R.color.rbcolorGreen)); } public void start(int flag) { this.flag = flag; } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getWidth(); int height = getHeight() - dp2px(50); //繪製底部的線條 canvas.drawLine(dp2px(30), height + dp2px(3), width - dp2px(30), height + dp2px(3), xLinePain); //左側外周的,需要劃分高度 int leftHeight = height - dp2px(10); //左側分成五部分 int hPerHeight = leftHeight / 5; //右側分成六部分 int rPerHeight = leftHeight / 6; hLinePain.setTextAlign(Paint.Align.CENTER); //設定五條虛線 for (int i = 0; i < 5; i++) { canvas.drawLine(dp2px(30), dp2px(10) + i * hPerHeight, width - dp2px(30), dp2px(10) + i * hPerHeight, hLinePain); } //設定數量的六條虛線 for (int i = 0; i < 6; i++) { canvas.drawLine(dp2px(30), dp2px(10) + i * rPerHeight, width - dp2px(30), dp2px(10) + i * rPerHeight, hLinePain); } //繪製左 Y 周座標 titlePain.setTextAlign(Paint.Align.RIGHT); titlePain.setTextSize(sp2px(12)); titlePain.setAntiAlias(true); titlePain.setStyle(Paint.Style.FILL); //設定左部的數字 for (int i = 0; i < ySteps.length; i++) { canvas.drawText(ySteps[i], dp2px(25), dp2px(14) + i * hPerHeight, titlePain); } //繪製右 Y 周座標 rtitlePain.setTextAlign(Paint.Align.LEFT); rtitlePain.setTextSize(sp2px(12)); rtitlePain.setAntiAlias(true); rtitlePain.setStyle(Paint.Style.FILL); for (int i= 0;i<rSteps.length;i++){ canvas.drawText(rSteps[i],width - dp2px(25),dp2px(14) + i * rPerHeight,rtitlePain); } //繪製 X周座標 int xAxisLength = width - dp2px(30); int columCount = xyear.length + 1; int step = xAxisLength / columCount; for (int i = 0; i < columCount - 1; i++) { canvas.drawText(xyear[i], dp2px(25) + step * (i + 1), height + dp2px(20), titlePain); } //繪製矩形 if (laniProgress != null && laniProgress.length > 0) { int stepNum = xAxisLength /3; //迴圈遍歷將兩條柱子畫出來 for (int i = 0; i < laniProgress.length; i++) { int value = laniProgress[i]; lpaint.setAntiAlias(true); lpaint.setStyle(Paint.Style.FILL); lpaint.setTextSize(sp2px(15)); lpaint.setColor(Color.parseColor("#228C10")); //柱狀圖的形狀 Rect rect = new Rect(); rect.left = stepNum * (0 + 1); rect.right = dp2px(30) + stepNum * (0 + 1); int rh = (int) (leftHeight - leftHeight * (value / 250.0)); rect.top = rh + dp2px(10); rect.bottom = height + dp2px(3); canvas.drawRect(rect, lpaint); } for (int i = 0; i < raniProgress.length; i++) { int value = raniProgress[i]; rpaint.setAntiAlias(true); rpaint.setStyle(Paint.Style.FILL); rpaint.setTextSize(sp2px(15)); rpaint.setColor(Color.parseColor("#F79F07")); //柱狀圖的形狀 Rect rect = new Rect(); rect.left = stepNum * (1 + 1); rect.right = dp2px(30) + stepNum * (1 + 1); int rh = (int) (leftHeight - leftHeight * (value*41.5 / 250.0)); rect.top = rh + dp2px(10); rect.bottom = height + dp2px(3); canvas.drawRect(rect, rpaint); } } } //像密度換成畫素 private int dp2px(int value) { float v = getContext().getResources().getDisplayMetrics().density; return (int) (v * value + 0.5f); } private int sp2px(int value) { float v = getContext().getResources().getDisplayMetrics().scaledDensity; return (int) (v * value + 0.5f); }

到此就完成了,如有不足還希望大家給出意見