代码要实现的功能:
饼状图开始时只有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();
}
网友评论