自定义简单条形图

还是先上图

 

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);

行了就这么多了,简单的自定义,代码注释也有,就不多解释了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值