import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
/**
* Created by hdz on 2017/1/12.
*/
public class BarChartView extends View {
private String titleText;
private int startPointX;
private int startPointY;
private int deltaX; //the delta between two x_value
private int deltaY;
private int countX; //the count of the x (for example a week is seven and a year is twelve)
private int countY;
private float paddingLeft;
private float paddingRight;
private float textSize;
private Paint paint;
private Paint linePaint;
private TextPaint textPaint;
private Path path;
private RectF rectF;
//用来表示横坐标的,当然也可以是数字
private List<String> weekList;
private List<String> monthList;
private List<String> quarterList;
private List<Integer> colorList;
private List<Integer> dataList;
public BarChartView(Context context) {
this(context, null);
}
public BarChartView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BarChartView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initAttrs(context, attrs, defStyleAttr);
init();
}
private void initAttrs(Context context, AttributeSet attrs, int defStyleAttr) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.BarChartView, defStyleAttr, 0);
titleText = array.getString(R.styleable.BarChartView_bar_title_text);
startPointX = array.getInteger(R.styleable.BarChartView_bar_start_point_x, 0);
startPointY = array.getInteger(R.styleable.BarChartView_bar_start_point_y, 0);
deltaX = array.getInteger(R.styleable.BarChartView_bar_delta_x, 0);
deltaY = array.getInteger(R.styleable.BarChartView_bar_delta_y, 0);
countX = array.getInteger(R.styleable.BarChartView_bar_conut_x, 0);
countY = array.getInteger(R.styleable.BarChartView_bar_conut_y, 0);
paddingLeft = array.getDimensionPixelSize(R.styleable.BarChartView_bar_padding_left, 0);
paddingRight = array.getDimensionPixelSize(R.styleable.BarChartView_bar_padding_right, 0);
textSize = array.getDimensionPixelSize(R.styleable.BarChartView_bar_text_size, 0);
array.recycle();
}
private void init() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
textPaint = new TextPaint();
textPaint.setAntiAlias(true);
path = new Path();
linePaint = new Paint();
linePaint.setColor(0xff2665ac);
linePaint.setAntiAlias(true);
linePaint.setStyle(Paint.Style.STROKE);
linePaint.setStrokeWidth(5);
rectF = new RectF();
dataList = new ArrayList<Integer>();
dataList.add(56);
dataList.add(76);
dataList.add(89);
dataList.add(36);
dataList.add(90);
dataList.add(19);
dataList.add(80);
initList();
}
private void initList() {
weekList = new ArrayList<String>();
monthList = new ArrayList<String>();
quarterList = new ArrayList<String>();
weekList.add("星期一");
weekList.add("星期二");
weekList.add("星期三");
weekList.add("星期四");
weekList.add("星期五");
weekList.add("星期六");
weekList.add("星期日");
colorList = new ArrayList<Integer>();
colorList.add(Color.argb(255, 255, 0, 0));
colorList.add(Color.argb(255, 0, 255, 0));
colorList.add(Color.argb(255, 0, 0, 255));
colorList.add(Color.argb(255, 0, 128, 255));
colorList.add(Color.argb(255, 128, 0, 255));
colorList.add(Color.argb(255, 128, 255, 0));
colorList.add(Color.argb(255, 128, 128, 255));
}
private void setList(List<Integer> dataList) {
this.dataList = dataList;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//get the padding
int paddingLeft = getPaddingLeft();
int paddingRight = getPaddingRight();
int paddingBottom = getPaddingBottom();
int paddingTop = getPaddingTop();
int height = getHeight();
int width = getWidth();
textPaint.setColor(0xff2665ac);
textPaint.setTextSize(textSize);
canvas.drawText(titleText, 0.5f * width - textPaint.measureText(titleText) * 0.5f, paddingTop + textPaint.getFontMetrics().bottom * 4, textPaint);
//表格的起始点
float startY = (textPaint.getFontMetrics().bottom * 4) * 2 + paddingTop;
float startX = textSize * 2 + paddingLeft;
float endY = height - textSize * 3 - paddingBottom;
float endX = width - (textSize + paddingRight);
//textSize * 2 这段空间是用来写横坐标的
//height - startY - textSize * 3 - paddingBottom 用于画图的高度
float chartHeight = endY - startY;
float chartWidth = endX - startX;
float deltaDistanceY = chartHeight / countY;
float deltaDistanceX = chartWidth / countX;
//画横线
for (int i = 0; i <= countY; i++) {
if (i == countY || i == 0) {
paint.setColor(0xff000000);
} else {
paint.setColor(0xffdddddd);
}
String numberY = ((countY - i) * deltaY) + "";
canvas.drawText(numberY, startX - (0.5f * textSize + textPaint.measureText(numberY)), startY + deltaDistanceY * i + textPaint.getFontMetrics().bottom * 2, textPaint);
canvas.drawLine(startX, startY + i * deltaDistanceY, endX, startY + i * deltaDistanceY, paint);
}
//画竖线
for (int i = 0; i <= countX; i++) {
if (i == 0 || i == countX) {
paint.setColor(0xff000000);
canvas.drawLine(startX + i * deltaDistanceX, startY, startX + i * deltaDistanceX, endY, paint);
}
String numberX = "" + (startPointX + i * deltaX);
}
//画竖条
for (int i = 0; i < dataList.size(); i++) {
rectF.set(startX + 1.0f / 6 * deltaDistanceX + i * deltaDistanceX, endY - dataList.get(i) * 1.0f / deltaY * deltaDistanceY, startX + (i + 1 - 1.0f / 6) *
deltaDistanceX, endY);
paint.setColor(colorList.get(i));
canvas.drawRect(rectF, paint);
canvas.drawText(dataList.get(i) + "", startX + (i + 0.5f) * deltaDistanceX - textPaint.measureText(dataList.get(i) + "") * 0.5f, endY - dataList.get(i) * 1.0f /
deltaY * deltaDistanceY - textPaint.getFontMetrics().bottom * 2.0f, textPaint);
String temp = weekList.get(i);
for (int j = 0; j < temp.length(); j++) {
canvas.drawText(temp.charAt(j) + "", startX + (i + 0.5f) * deltaDistanceX - textPaint.measureText(temp.charAt(j) + "") * 0.5f, endY + textPaint.getFontMetrics()
.bottom * (4.0f + j * 4), textPaint);
}
}
}
}
Eclipse:xmlns:app=”http://schemas.android.com/apk/res/com.hdz.widget”
AndroidStudio:”http://schemas.android.com/apk/res-auto”