Android_自定义控件_动态饼状图

代码要实现的功能:
饼状图开始时只有5个角度,通过控件接收用户点按事件、设置定时器、属性动画等方法,每次增加一定的角度,直到360度。

//   角度
    int angle = 5;
//   所占360度的比例
    float rate = 0;
//   实现onDraw方法,这是自定义控件画的过程都要实现的方法
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawPieChart(canvas,Color.BLACK,(float)(angle/360.0));
    }

    private void drawPieChart(Canvas canvas,int color,float rate){
        path = new Path();
        Paint paint = new Paint ();
       //抗锯齿
        paint.setAntiAlias(true);
        paint.setColor(color);
//        设置填充模式
        paint.setStyle(Paint.Style.FILL);
//        画圆
        canvas.drawArc(50,100,350,400,0,360*rate,true,paint);
    }

//    方法1.用手点的方式实现圆角度增加
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            if (angle == 360) {
                angle = 360;
            }
            rate = (float)(angle/360.0);
        }
        angle += 20;
//    调用invalidate方法执行draw过程,重绘View树
        invalidate();
        return true;
    }
//   调用onSizeChanged方法,用另外两种方法实现
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

//    方法2.用定时器的方式实现圆角度增加
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                angle += 2;
                if (angle >= 360) {
                    angle = 360;
                    timer.cancel();
                }
//               主线程调用这个方法(重绘View树)
                invalidate();
//                子线程
//                postInvalidate();
            }
        },0,50);

//        方法3.用属性动画实现该动画
//        设置动画的范围
        final ValueAnimator va = ValueAnimator.ofInt(0,360);
        va.setDuration(2000);
        va.setRepeatCount(ValueAnimator.INFINITE);
        va.setRepeatMode(ValueAnimator.REVERSE);
//        监听属性的值
        va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
//                获取动画执行过程中的属性值
                angle = (int)valueAnimator.getAnimatedValue();
                invalidate();
            }
        });
//        启动动画
        va.start();
    }

你可能感兴趣的:(Android_自定义控件_动态饼状图)