天天看点

Android动画模板

1.ViewAnimation(视图动画)

xml方法:

在res目录下新建anim文件夹,并创建一个xml文件:

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
    	android:duration="1000"
    	android:fillAfter="true"
    	android:repeatMode="restart">
        <alpha
            android:fromAlpha="1"
            android:toAlpha="0" />
        <scale
            android:fromXScale="1"
            android:fromYScale="1"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="2"
            android:toYScale="2" />
        <translate
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="50%"
            android:toYDelta="50%" />
        <rotate
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" />
    </set>
           

Java代码:

Animation anim = AnimationUtils.loadAnimation(this,R.anim.my_anim);
		anim.setInterpolator(this,android.R.anim.accelerate_decelerate_interpolator);
        findViewById(R.id.image).startAnimation(anim);
           

注:属性pivotX/Y,fromX/YDelta,toX/YDelta属性有三种赋值方式:

1.直接赋予数值,表示轴点在该视图左上角加上该数值,注意单位是px,不是dp

2.数值a%,表示轴点在该视图的a%处

3.数值a%p,表示轴点在该视图的左上角加上父视图长宽的a%

另Interpolator也可以自定义,其xml文件也写在anim目录下,略。

2.DrawableAnimation(帧动画)

在res/drawable目录下建立一个xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item
        android:drawable="@mipmap/lottery_1"
        android:duration="200" />
    <item
        android:drawable="@mipmap/lottery_2"
        android:duration="200" />
    <item
        android:drawable="@mipmap/lottery_3"
        android:duration="200" />
</animation-list>
           

其中oneshot表示是否循环播放

Java代码:

ImageView imageView = ((ImageView)(findViewById(R.id.image)));
        imageView.setImageResource(R.drawable.my_anim);
        AnimationDrawable drawable = (AnimationDrawable) imageView.getDrawable();
        drawable.start();
           

3.PropertyAnimation(属性动画)

3.1 ValueAnimator:

ValueAnimator通过自身变化时的回调去通知某个值的变化,例如:

ValueAnimator animator = ValueAnimator.ofInt(0,10,5);
        animator.setDuration(1000);
        animator.setStartDelay(100);
        animator.setRepeatCount(5);
        animator.setRepeatMode(ValueAnimator.REVERSE);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                
            }
        });
        animator.start();
           

ofObject方法可以完成一个对象到另一个对象的渐变,例如:

Point p1 = new Point(0,0);
        Point p2 = new Point(10,10);
        TypeEvaluator evaluator = new TypeEvaluator() {
            @Override
            public Object evaluate(float v, Object o1, Object o2) {
                //v表示动画完成度
                return null;
            }
        };
        ValueAnimator animator = ValueAnimator.ofObject(evaluator,p1,p2);
        animator.start();
           
3.2 ObjectAnimator

ObjectAnimator是ValueAnimator的子类

String propertyName = "alpha";     // rotation    rotationX   translationX    scaleX
  		//对View对象的某个float型成员变量做某种变化
  		ObjectAnimator animator = ObjectAnimator.ofFloat(View, propertyName, 0f, 1f, 0f);
  		animator.setDuration(5000);
  		animator.setRepeatCount(10);
  		//RepeatMode包括RESTART,REVERSE(动画完成后反向做动画),INFINITE,
  		animator.setRepeatMode(ValueAnimator.REVERSE);
  		animator.start();
           

关于propertyName,这里之所以可以把propertyName设置为alpha等字符串,是因为View类中已有setAlpha等方法;

class View {
	public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha);		//透明度
	public void setScaleX(float scaleX);									//缩放
	public void setRotation(float rotation)									//旋转
	public void setTranslationX(float translationX);						//平移
}
           

如果我们自定以的View也可以为需要变化的变量设置一个方法,ObjectAnimator自动改变这个变量的值,例如:

public class TestView extends View {
    //private Matrix matrix;
    Paint paint;
    int x = 0;

    public TestView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(0xFFFFFFFF);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(x, 150, 60, paint);
    }
	
	//这个方法会不断被ObjectAnimator自动调用
    public void setX(int x) {
        this.x = x;
        postInvalidate();
    }

    public void startAnim() {
    	//这里propertyName为x,所以View必须提供一个叫做setX的方法供ObjectAnimator调用
        String propertyName = "x";			
        ObjectAnimator animator = ObjectAnimator.ofInt(this, propertyName, 0, 500);
        animator.setDuration(5000);
        animator.setRepeatCount(10);
        animator.setRepeatMode(ValueAnimator.REVERSE);
        animator.start();
    }
}