一、ValueAnimator
ValueAnimator是整个属性动画机制当中最核心的一个类。属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。
(1)ValueAnimator的构造方法
- static ValueAnimator ofInt(int... values)
以整型数值的形式从初始值过渡到结束值,内置IntEvaluator估值器。 - static ValueAnimator ofFloat(float... values)
以浮点型数值的形式从初始值 过渡到结束值,内置FloatEvaluator估值器 - static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values)
以对象的形式从初始值过渡到结束值,需要自定义估值器
(2)ValueAnimator的使用方式
ValueAnimator animator = ValueAnimator.ofInt(0,3);
animator.setDuration(5000);//播放时长
animator.setStartDelay(300);//延迟播放
animator.setRepeatCount(0);//重放次数
animator.setRepeatMode(ValueAnimator.RESTART);//重放模式
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//获取改变后的值
int currentValue = (int) animation.getAnimatedValue();
//改变后的值发赋值给对象的属性值
view.setproperty(currentValue);
//刷新视图
view.requestLayout();
}
});
//启动动画
animator.start();
- 在路径res/animator路径下新建XML文件设置动画参数。
- 代码中启动动画
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="4000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:startOffset="1000"
android:valueFrom="0"
android:valueTo="100"
android:valueType="intType" />
- duration:设置动画时间
- interpolator:设置插值器
- repeatCount:设置播放次数
- repeatMode:设置重复播放类型
- valueFrom:设置开始参数
- valueTo:设置结束参数
- valueType:设置参数值类型
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.animation);
animator.setTarget(view);
animator.start();
(3)自定义TypeEvaluator估值器
//通过查看IntEvaluator估值器源码得知,通过数学公式,返回当前动画的值。
public class MyEvaluator implements TypeEvaluator {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
//通过startValue和endValue计算出新的Object对象并返回
return null;
}
}
(4)Interpolator插值器
系统插值器
- AccelerateDecelerateInterpolator:先加速再减速
- AccelerateInterpolator:持续加速
- AnticipateInterpolator:先退后再加速前进
- AnticipateOvershootInterpolator:先退后再加速前进,超出终点后再回终点
- BounceInterpolator:结束时弹球效果
- CycleInterpolator:周期运动
- DecelerateInterpolator:减速
- LinearInterpolator:匀速
- OvershootInterpolator:向前弹出一定值之后回到原来位置
二、自定义view动画效果
public class MyAnimatorView extends View {
private Paint paint;//画笔
private Point point;//记录当前动画的x,y坐标
public static final float RADIUS = 50f;
public MyAnimatorView(Context context) {
super(context);
}
public MyAnimatorView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyAnimatorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//第一次绘制时
if (point == null) {
//初始化坐标为(50f, 50f)
point = new Point(RADIUS, RADIUS);
drawCircle(canvas);
startAnimation();
} else {//非第一次绘制
drawCircle(canvas);
}
}
//画圆
private void drawCircle(Canvas canvas) {
float x = point.getX();
float y = point.getY();
canvas.drawCircle(x, y, RADIUS, paint);
}
//开始动画
private void startAnimation() {
//设置起始值
Point startPoint = new Point(RADIUS, RADIUS);
//设置结束值
Point endPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS);
final ValueAnimator anim = ValueAnimator.ofObject(new MyEvaluator(), startPoint, endPoint);
//设置插值器
anim.setInterpolator(new BounceInterpolator());
//设置监听,每当Point的值有改变的时候,都会调用onAnimationUpdate()方法
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//更新curPoint,即更新当前坐标
point = (Point) animation.getAnimatedValue();
// 刷新,重现调用onDraw()方法
invalidate();
}
});
anim.setDuration(5000);
anim.start();
}
}
- 在布局文件中引入该view
三、ObjectAnimator
ObjectAnimator是ValueAnimator的子类,ValueAnimator只是对值进行平滑的动画过渡;ObjectAnimator直接对任意对象的任意属性进行动画操作,如View的alpha属性
ValueAnimator需要我们为对象属性手动赋值;ObjectAnimator会为对象属性自动赋值。
(1)ObjectAnimator的实现方式
使用xml方式实现
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="scaleX"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="200"
android:valueFrom="0.0"
android:valueTo="1.0"
android:valueType="floatType">
</objectAnimator>
- duration :表示动画执行的时间
- propertyName:表示修改的对象的哪个属性值,这里是透明度
- valueFrom:表示从哪个状态值开始动画
- valueTo:表示到哪个状态值结束动画
- valueType:类型估值,主要用于设置动画操作属性的值
- repeatMode:表示重复的模式 reverse表示反向,restart为重新执行
- repeatCount:动画重复的计数,动画将会执行该值+1次
- startOffset:动画多次执行的间隔时间
- interpolator:指定动画插入器
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.animator_o);
anim.setTarget(tv_name);
anim.start();
使用代码动态实现
ObjectAnimator alphaAnimation = ObjectAnimator.ofFloat(tv_name, "scaleX", 0f, 1f);
alphaAnimation.setDuration(5000);
alphaAnimation.setRepeatCount(0);
alphaAnimation.setRepeatMode(ValueAnimator.REVERSE);
alphaAnimation.setStartDelay(1000);
alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
alphaAnimation.start();
四、AnimatorSet
组合动画xml实现
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="1000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="scaleX"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="200"
android:valueFrom="1.0"
android:valueTo="0.0"
android:valueType="floatType" />
<objectAnimator
android:duration="1000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="scaleY"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="200"
android:valueFrom="1.0"
android:valueTo="0.0"
android:valueType="floatType" />
</set>
代码实现
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(tv_name, "scaleX", 1f, 0f);
scaleXAnimator.setDuration(1000);
scaleXAnimator.setRepeatCount(1);
scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);
scaleXAnimator.start();
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(tv_name, "scaleY", 1f, 0f);
scaleYAnimator.setDuration(1000);
scaleYAnimator.setRepeatCount(1);
scaleYAnimator.setRepeatMode(ValueAnimator.REVERSE);
animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
animatorSet.start();
五、Animator监听器
ObjectAnimator、ValueAnimator,AnimatorSet都是继承自Animator类的。因此addListener()这个方法算是一个通用的方法。
animator.addListener(new Animator.AnimatorListener() {
//动画开始时执行
@Override
public void onAnimationStart(Animator animation) {
}
//动画结束时执行
@Override
public void onAnimationEnd(Animator animation) {
}
//动画取消时执行
@Override
public void onAnimationCancel(Animator animation) {
}
//动画重复时执行
@Override
public void onAnimationRepeat(Animator animation) {
}
});