Android属性动画(二):深入valueAnimator和objecAnimator

ValueAnimator的高级用法

无论是valueAnimator还是objectAnimator都离不开TypeEvaluator的使用,那TypeEvaluator是用来干嘛的?

TypeEvaluator是用来告知动画系统如何从开始值过渡到结束值,例如上一篇文章中使用的valueAnimator的offInt()的实现,其实就是内

置了一个TypeEvaluator来实现的。

接下来我们用一个实例来学习ValueAnimator的高级用法,该实例实现一个圆点Point从屏幕左上角移到右下角。

1.首先创建实体类Point

public class Point {
	
	private float x;
	private float y;
	
	public Point(float x, float y){
		this.x = x;
		this.y = y;
	}

	public float getX() {
		return x;
	}

	public float getY() {
		return y;
	}
	

}

2.创建一个MyEvaluator去实现TypeEvaluator接口

public class PointEvaluator implements TypeEvaluator {

	@Override
	public Object evaluate(float fraction, Object startValue, Object endValue) {
		
		Point startPoint = (Point) startValue;
		Point endPoint = (Point) endValue;
		
		float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
		float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
		
		Point point = new Point(x, y);
		return point;
	}

}

这里的fraction很重要,它告知了我们当前动画的完成度


3.然后我们自定义一个view

public class MyView extends View {
	
	private static final float RADIUS = 50f;
	
	private Paint paint;
	
	private Point currentPoint;

	//换成一参数构造方法就不能运行了
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setColor(Color.BLUE);
	}


	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		
		if(currentPoint == null){
			currentPoint = new Point(RADIUS, RADIUS);
			drawCircle(canvas);
			startAnimation();
		}else{
			drawCircle(canvas);
		}
	}
	
	public void drawCircle(Canvas canvas){
		float x = currentPoint.getX();
		float y = currentPoint.getY();
		canvas.drawCircle(x, y, RADIUS, paint);
	}
	
	public void startAnimation(){
		Point startPoint = new Point(RADIUS, RADIUS);
		Point endPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS);
		
		ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
		anim.addUpdateListener(new AnimatorUpdateListener() {
			
			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				currentPoint = (Point) animation.getAnimatedValue();
				invalidate();//刷新view视图,触发onDraw的调用
			}
		});
		
		anim.setDuration(5000);
		anim.start();
	}
	

}
首先在构造方法里实例化了一个画笔Paint,并设置了Piant的属性。Paint.ANTI_ALIAS_FLAG是使位图抗锯齿的标志,并把画笔颜色

设置为蓝色。drawCicle()方法中用Canvas的drawCircle()画出了一个圆。接着实现了view的onDraw()方法,并在onDraw()中去绘制。

startAnimation()用于播放动画,ValueAnimator的ofObject()中,首先传入Evaluator的实例,然后后面的参数告知如何变化。其中在监

听器中添加invalidate()方法,使得每一次动画发生了变化,就刷新视图,因此会触发onDraw()的调用,重新绘制视图


二:ObjectAnimator的高级用法

可以结合上面实例,在动画播放中,改变Point的颜色

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值