饼图-每个扇形图可点击

/**
 * @author: 魏
 * @date: 2021/11/9
 * 饼图-每个扇形图可点击
 */
public class RadiusView extends View {

    private Paint paint;
    private float centerCircleX;
    private float centerCircleY;

    private Region mRegion1=new Region();
    private Region mRegion2=new Region();
    private Region mRegion3=new Region();
    private Region mRegion4=new Region();

    private float startAngle1 = 0;//起始角度
    private float startAngle2 = 0;//起始角度
    private float startAngle3 = 0;//起始角度
    private float startAngle4 = 0;//起始角度
    private float sweepAngle1=30;//扫描角度
    private float sweepAngle2=120;//扫描角度
    private float sweepAngle3=150;//扫描角度
    private float sweepAngle4=60;//扫描角度

    private boolean down1=true;
    private boolean down2=false;
    private boolean down3=false;
    private boolean down4=false;
    private OnRadiusClickListener onRadiusClickListener;
    private int i=0;


    public RadiusView(Context context) {
        super(context);
        initPaint();
    }

    public RadiusView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }

    public RadiusView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }

    //初始化画笔
    private void initPaint() {
        paint = new Paint();
        //设置画笔模式:填充
        paint.setStyle(Paint.Style.FILL);
        paint.setTextSize(30);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.translate(getWidth() / 2, getHeight() / 2);             //将画布坐标原点移到中心位置
        float r = (float) (Math.min(getWidth(), getHeight()) / 2);//饼状图半径(取宽高里最小的值)
        float r2 = (float) (Math.min(getWidth()-(getWidth()/7), getHeight()-(getHeight()/7)) / 2);
        float r3 = (float) (Math.min(getWidth()-2*(getWidth()/7), getHeight()-2*(getHeight()/7)) / 2);
        float r4 = (float) (Math.min(getWidth()-3*(getWidth()/7), getHeight()-3*(getHeight()/7)) / 2);


        final Path ovalPath1 = new Path();
        final Path ovalPath2 = new Path();
        final Path ovalPath3 = new Path();
        final Path ovalPath4 = new Path();

        //初始化区域
        RectF rectF = new RectF();
        RectF rectF1 = new RectF();
        RectF rectF2 = new RectF();
        RectF rectF3 = new RectF();
        RectF rectF4 = new RectF();



        if (down1){
            rectF1.set(-r, -r, r, r);
        }else {
            rectF1.set(-r2, -r2, r2, r2);
        }

        if (down2){
            rectF2.set(-r, -r, r, r);
        }else {
            rectF2.set(-r2, -r2, r2, r2);
        }

        if (down3){
            rectF3.set(-r, -r, r, r);
        }else {
            rectF3.set(-r2, -r2, r2, r2);
        }

        if (down4){
            rectF4.set(-r, -r, r, r);
        }else {
            rectF4.set(-r2, -r2, r2, r2);
        }



        rectF.set(-r, -r, r, r);
        paint.setColor(getResources().getColor(R.color.color_122));
        canvas.drawArc(rectF, 0,360, true, paint);
        //ovalPath.moveTo(0, 0);
        //ovalPath.lineTo(r, r);
        //ovalPath.close();
        //ovalPath.computeBounds(rectF, false);
        paint.setColor(getResources().getColor(R.color.color_111));
        ovalPath1.addArc(rectF1, startAngle1,sweepAngle1);
        ovalPath1.lineTo(0, 0);
        mRegion1.setPath(ovalPath1, new Region((int)rectF1.left, (int) rectF1.top, (int) rectF1.right,(int)rectF1.bottom));
        canvas.drawPath(ovalPath1,paint);

        startAngle2=startAngle1+sweepAngle1;
        paint.setColor(getResources().getColor(R.color.color_108));
        ovalPath2.addArc(rectF2, startAngle2,sweepAngle2);
        ovalPath2.lineTo(0, 0);
        mRegion2.setPath(ovalPath2, new Region((int)rectF2.left, (int) rectF2.top, (int) rectF2.right,(int)rectF2.bottom));
        canvas.drawPath(ovalPath2,paint);

        startAngle3=startAngle2+sweepAngle2;
        paint.setColor(getResources().getColor(R.color.color_109));
        ovalPath3.addArc(rectF3, startAngle3,sweepAngle3);
        ovalPath3.lineTo(0, 0);
        mRegion3.setPath(ovalPath3, new Region((int)rectF3.left, (int) rectF3.top, (int) rectF3.right,(int)rectF3.bottom));
        canvas.drawPath(ovalPath3,paint);

        startAngle4=startAngle3+sweepAngle3;
        paint.setColor(getResources().getColor(R.color.color_110));
        ovalPath4.addArc(rectF4, startAngle4,sweepAngle4);
        ovalPath4.lineTo(0, 0);
        mRegion4.setPath(ovalPath4, new Region((int)rectF4.left, (int) rectF4.top, (int) rectF4.right,(int)rectF4.bottom));
        canvas.drawPath(ovalPath4,paint);


        rectF.set(-r3, -r3, r3, r3);
        paint.setColor(getResources().getColor(R.color.color_all));
        canvas.drawArc(rectF, 0,360, true, paint);

        rectF.set(-r4, -r4, r4, r4);
        paint.setColor(getResources().getColor(R.color.white));
        canvas.drawArc(rectF, 0,360, true, paint);

        centerCircleX = (getWidth() + getPaddingLeft() - getPaddingRight()) / 2;
        centerCircleY = (getHeight() + getPaddingTop() - getPaddingBottom()) / 2;
    }

    public boolean onTouchEvent(MotionEvent event) {
        float x;
        float y;
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                x = event.getX()-centerCircleX;
                y = event.getY()-centerCircleY;
                boolean b1 = mRegion1.contains((int) x, (int) y);
                boolean b2 = mRegion2.contains((int) x, (int) y);
                boolean b3 = mRegion3.contains((int) x, (int) y);
                boolean b4 = mRegion4.contains((int) x, (int) y);
                if (b1){
                    Log.d("onTouchEvent", "onTouchEvent: b1: "+b1);
                    down1 = true;
                    down2 = false;
                    down3 = false;
                    down4 = false;
                    i=1;
                }

                if (b2){
                    Log.d("onTouchEvent", "onTouchEvent: b2: "+b2);
                    down1 = false;
                    down2 = true;
                    down3 = false;
                    down4 = false;
                    i=2;
                }

                if (b3){
                    Log.d("onTouchEvent", "onTouchEvent: b3: "+b3);
                    down1 = false;
                    down2 = false;
                    down3 = true;
                    down4 = false;
                    i=3;
                }

                if (b4){
                    Log.d("onTouchEvent", "onTouchEvent: b4: "+b4);
                    down1 = false;
                    down2 = false;
                    down3 = false;
                    down4 = true;
                    i=4;
                }

                if (onRadiusClickListener!=null){
                    onRadiusClickListener.OnRadiusClickListener(i);
                }
                break;

        }
        //更新绘制
        invalidate();
        return true;
    }

    public void setSweepAngle(float sweepAngle1,float sweepAngle2,float sweepAngle3,float sweepAngle4){
        this.sweepAngle1 = sweepAngle1;
        this.sweepAngle2 = sweepAngle2;
        this.sweepAngle3 = sweepAngle3;
        this.sweepAngle4 = sweepAngle4;
    }

    public void setOnRadiusClickListener(OnRadiusClickListener onRadiusClickListener){
        this.onRadiusClickListener = onRadiusClickListener;
    }

    public interface OnRadiusClickListener{
        void OnRadiusClickListener(int i);
    }

}

不喜勿喷,仅供大家参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值