Android绘制自定义饼图

绘制自定义饼图
1.先上效果图:

在这里插入图片描述

2.下面分析需要用到的技术点
canvas.translate(100,100);

把当前画布的原点移到(100,100),后面的操作都以(100,100)作为参照点,即把(100,100)作为坐标系的(0,0),默认原点为(0,0)

在这里插入图片描述

 canvas.drawArc(rectF, startAngle, swipeAngle, true, mPaint);

说明:

第一个参数rectF,定义的圆弧的形状和大小的范围

在这里插入图片描述

第二个参数:float startAngle,设置圆弧是从哪个角度来顺时针绘画。

在这里插入图片描述

第三个参数:float sweepAngle,设置圆弧扫过的角度。

在这里插入图片描述

第四个参数:boolean useCenter,设置我们的圆弧在绘画的时候,是否经过圆心。

在这里插入图片描述

即:为false时候直接AB相连接,为true时候ACB连接

第五个参数:画笔不用说。

3.下面贴一下关键代码

说了上面这么多相信聪明的你也是可以直接写出来的。

首先我们定义一些内置的颜色

 private int[] colos = new int[]{0xFF663311, 0xFF6495ED, 0xFFE32636, 0xFF174EF6};

获取我们设置的view的宽高以及padding

 @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        paddingLeft = getPaddingLeft();
        paddingRight = getPaddingRight();
        paddingBottom = getPaddingBottom();
        paddingTop = getPaddingTop();
        mWith = w;
        mHeight = h;
    }

移动画布到我们的view的中心位置,这里注意要减去padding后的中心位置

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mPieDataBeans.size() < 1) {
            return;
        }
        //canvas.drawRect(0, 0, mWith, mHeight, mPaint);
       
        int realWith = mWith - paddingLeft - paddingRight;
        int realHeight = mHeight - paddingTop - paddingBottom;
        int r = (Math.min(realWith, realHeight)) / 2;
        canvas.translate(paddingLeft + realWith / 2, paddingTop + realHeight / 2);
         


    }

根据传入的参数动态绘制startAngle与swipeAngle

 RectF rectF = new RectF(-r, -r, r, r);
for (int i = 0; i < mPieDataBeans.size(); i++) {
            swipeAngle = mPieDataBeans.get(i).getNum() * 360 / total;
            mPaint.setColor(colos[mPieDataBeans.get(i).getColor()]);
            canvas.drawArc(rectF, startAngle, swipeAngle, true, mPaint);
            startAngle = startAngle + swipeAngle;


        }

说明:其中的total为传的list集合的总数量,mPieDataBeans.get(i).getNum()为每个数据自己的值, swipeAngle = mPieDataBeans.get(i).getNum() * 360 / total;这个方法就可以算出每个值应该扫过的角度。每循环一次startAngle 就要重新计算起始位置,startAngle = startAngle + swipeAngle; mPaint.setColor(colos[mPieDataBeans.get(i).getColor()]);,这个是根据传入的编号获取对应的颜色,设置画笔颜色。

外部暴露方法

 public void setPieData(List<PieDataBean> data) {
        this.mPieDataBeans = data;
        total = 0;
        initData();
        invalidate();
    }

每次设置数据,记得调用一下invalidate();,我这个 initData();主要是计算total的值。

每次设置数据,记得调用一下invalidate();,我这个 initData();主要是计算total的值。

好了就到这儿了,讲完了,大家试一下吧,下期增加标注信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值