自定义条形统计图












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

猜你喜欢

转载自blog.csdn.net/qq_35920289/article/details/54572822