还是先上图
public class BarChartView extends View {
private int mWindowWidth; //屏幕宽
private int mViewWidth; //view宽
private int mViewHeight; //view高
private List<DataEnty> datas = new ArrayList<>(); //图表数据
private Paint barChartPaint; //条形图画笔
private Paint coordinatePaint; //坐标系画笔
private Paint textPaint; //文字画笔
private int distance = 100; //边距的大小,用于留地方写文字
private int mMarginLeft; //左边距
private int cell = 50; //柱子之间的间隙
private int barWidth = 50; //柱子的宽度
public BarChartView(Context context) {
super(context);
}
public BarChartView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public BarChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mViewHeight = h;
mViewWidth = w;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mWindowWidth = DimenUtils.getScreenWidth();
//初始化画笔
barChartPaint = new Paint();
barChartPaint.setColor(Color.RED);
barChartPaint.setAntiAlias(true);
coordinatePaint = new Paint();
coordinatePaint.setColor(Color.BLUE);
coordinatePaint.setTextSize(30);
coordinatePaint.setAntiAlias(true);
coordinatePaint.setStrokeWidth(5);
textPaint = new Paint();
textPaint.setTextSize(40);
textPaint.setAntiAlias(true);
textPaint.setColor(Color.CYAN);
mMarginLeft = getSize(100);
//画X轴
canvas.drawLine(getSize(distance),mViewHeight-getSize(distance),mViewWidth+getSize(distance),mViewHeight-getSize(distance),coordinatePaint);
//画Y轴
canvas.drawLine(getSize(distance),mViewHeight-getSize(distance),getSize(distance),0,coordinatePaint);
List<Integer> number = new ArrayList<>();
for (int i = 0; i < datas.size(); i++) {
number.add(datas.get(i).getNumber());
}
//取出数组中的最大值计算图的比例,防止因为数字过大或者过小显示不出或者显示不全
int max = Collections.max(number);
//绘制柱子
for (int i = 0; i < datas.size(); i++) {
float scale = (float) (datas.get(i).getNumber() / (float)(max+200));
//循环画圆柱
canvas.drawRect(mMarginLeft+mMarginLeft+i*getSize(cell) + (getSize(barWidth)) * i, (mViewHeight-scale * (mViewHeight-getSize(getSize(distance))))-getSize(distance), mMarginLeft +i*getSize(cell)+ getSize(barWidth) * i + getSize(barWidth), mViewHeight-getSize(distance), barChartPaint);
float v3 = textPaint.measureText(String.valueOf(datas.get(i).getNumber()));
float x3 = (mMarginLeft +i*getSize(cell)+ getSize(barWidth) * i + getSize(barWidth)+getSize(barWidth/2))-getSize(v3/2);
canvas.drawText(String.valueOf(datas.get(i).getNumber()), x3, (mViewHeight-scale * (mViewHeight-getSize(distance)))-getSize(distance+20), textPaint);
//绘制X轴文字
canvas.drawText(datas.get(i).getDate(),x3,mViewHeight-getSize(50),coordinatePaint);
//绘制Y轴的文字
float textWidth = coordinatePaint.measureText(String.valueOf(datas.get(i).getNumber()));
canvas.drawText(String.valueOf(i*((max+200)/datas.size())),textWidth/2,mViewHeight-getSize(distance)-(((mViewHeight-getSize(distance))/datas.size())*i),coordinatePaint);
}
}
private int getSize(int size){
//因为用的1080手机做的适配 所以这里除以1080
float a = Float.parseFloat(mWindowWidth+"")/(1080f/ Float.parseFloat(size+""));
return (int) a;
}
private float getSize(float size){
//因为用的1080手机做的适配 所以这里除以1080
float a = Float.parseFloat(mWindowWidth+"")/(1080f/ Float.parseFloat(size+""));
return a;
}
public void setData(List<DataEnty> enty) {
datas.clear();
datas.addAll(enty);
invalidate();
}
实体类代码
public class DataEnty {
private int number;
private String date;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
使用方法
for (int j = 0; j < 5; j++) {
DataEnty dataEnty = new DataEnty();
dataEnty.setDate("03-"+(j+6));
dataEnty.setNumber(list.get(j));
dataEntyList.add(dataEnty);
}
barchart.setData(dataEntyList);
行了就这么多了,简单的自定义,代码注释也有,就不多解释了