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();
}
}