绘制自定义饼图
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的值。
好了就到这儿了,讲完了,大家试一下吧,下期增加标注信息。