本文参考:http://www.runoob.com/w3cnote/android-tutorial-valueanimator2.html
参考上述博文运行后觉得适合刚接触不就还不太熟悉animator动画的初学者学习。
运行效果:
主要学习的几个点:
1.自定义 Evaluator
2.补间器 Interpolator
ValueAnimator自定义插值器,并没有内置属性值计算器而且没有View的命名属性(拥有getter()和setter()的属性)。因此,需要添加ValueAnimator.AnimatorUpdateListener,添加自定义属性string例如本例中的aaa属性,并设置getAaa() / setAaa()方法,然后调用invalidate来设置View的属性完成自动更新。
具体可以参照代码,运行下就很明白了
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by Jay on 2015/11/18 0018.
*/
public class AnimView2 extends View {
public static final float RADIUS = 80.0f;
private Point currentPoint;
private Paint mPaint;
private int mColor;
public AnimView2(Context context) {
this(context, null);
}
public AnimView2(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public AnimView2(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.BLUE);
}
private void drawCircle(Canvas canvas){
float x = currentPoint.getX();
float y = currentPoint.getY();
canvas.drawCircle(x, y, RADIUS, mPaint);
}
private void startAnimation() {
Point startPoint = new Point(getWidth() / 2, RADIUS);
Point endPoint = new Point(getWidth() / 2, getHeight() - RADIUS);
ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (Point) animation.getAnimatedValue();
invalidate();
}
});
ObjectAnimator objectAnimator = ObjectAnimator.ofObject(this, "aaa", new ColorsEvaluator(),
Color.BLUE, Color.RED); //此处属性可以自定义为任何名字,但是必须要提供set() / get()方法才可以生效
//动画集合将前面两个动画加到一起,with同时播放
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(anim).with(objectAnimator);
animatorSet.setStartDelay(1000l);
animatorSet.setDuration(10000l);
animatorSet.setInterpolator(new DecelerateAccelerateInterpolator());
animatorSet.start();
}
@Override
protected void onDraw(Canvas canvas) {
if (currentPoint == null) {
currentPoint = new Point(getWidth() / 2, RADIUS);
drawCircle(canvas);
startAnimation();
} else {
drawCircle(canvas);
}
}
private class DecelerateAccelerateInterpolator implements TimeInterpolator {
@Override
public float getInterpolation(float input) {
if (input < 0.5) {
return (float) (Math.sin(input * Math.PI) / 2);
} else {
return 1 - (float) (Math.sin(input * Math.PI) / 2);
}
}
}
//aaa的get和set方法~
public int getAaa() {
return mColor;
}
public void setAaa(int color) {
mColor = color;
mPaint.setColor(color);
invalidate();
}
}
需要注意的点:
此处属性aaa可以自定义为任何名字,但是必须要提供set() / get()方法才可以生效
View Animation通过重绘View的视图的方式来完成View的动画效果,但View对象本身没有改变。在Android 3.0(API 11),对View添加了新属性和相应的get()和set(),通过在调用set方法设置属性时,其属性更改时会自动调用invalidate()方法来刷新屏幕。 view用拥有set()方法的属性列表:
属性动画可以通过更改View的属性,重绘View,更改属性后自动调用invalidate()方法来刷新屏幕,以完成动画效果。
Point.java类:
public class Point {
private float x;
private float y;
public Point() {
}
public Point(float x, float y) {
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public float getY() {
return y;
}
public void setX(float x) {
this.x = x;
}
public void setY(float y) {
this.y = y;
}
}
自定义的PointEvaluator.java:
import android.animation.TypeEvaluator;
/**
* Created by Jay on 2015/11/18 0018.
*/
public class PointEvaluator implements TypeEvaluator{
@Override
public Point evaluate(float fraction, Point startValue, Point endValue) {
float x = startValue.getX() + fraction * (endValue.getX() - startValue.getX());
float y = startValue.getY() + fraction * (endValue.getY() - startValue.getY());
Point point = new Point(x, y);
return point;
}
}
完整的项目已经上传到git:
https://github.com/buder-cp/base_component_learn/tree/master/AnimatorDemo3