效果图
/** * Created by lz on 2018/10/24. * 功能描述:扇形 */ public class PieChat extends View { //Utils.dp2px dp转px private static final int RADIUS = (int) Utils.dp2px(150); private static final int LENGTH = (int) Utils.dp2px(20); private static final int PULLED_OUT_INDEX = 2; Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); //Rect的参数是 int型 , RectF的参数是float型,由此可以看出RectF比Rect的精确度更高。,他们都是通过四个坐标参数来确定矩形的区域。 RectF bounds = new RectF(); int[] angles = {60, 100, 120, 80}; int[] colors = {Color.parseColor("#2979FF"), Color.parseColor("#C2185B"), Color.parseColor("#009688"), Color.parseColor("#FF8F00")}; public PieChat(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); bounds.set(getWidth()/2 - RADIUS,getHeight()/2-RADIUS,getWidth()/2+RADIUS,getHeight()/2+RADIUS); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int currentAngle = 0; for (int i=0;i<angles.length;i++){ mPaint.setColor(colors[i]); canvas.save(); if (i==PULLED_OUT_INDEX){ canvas.translate((float) Math.cos(Math.toRadians(currentAngle + angles[i] / 2)) * LENGTH, (float) Math.sin(Math.toRadians(currentAngle + angles[i] / 2)) * LENGTH); } canvas.drawArc(bounds,currentAngle,angles[i],true,mPaint); canvas.restore(); currentAngle += angles[i]; } } }