Android 动画之 Property 属性动画
- 属性动画能对对象的任意属性(比如位置、大小、颜色、透明度等)进行动画处理,对象的属性会从初始状态逐渐变为结束状态,这个过程中会创建多个连续的中间状态,逐帧播放后就会形成属性渐变效果,从而产生平滑的过渡效果
- 属性动画是通过赋值改变对象的属性值来实现动画效果的,所以可以进行事件交互,相对于补间动画来说属性动画的功能更加强大和灵活,属性动画的核心思想就是通过反射技术操作属性的 getter 和 setter 方法,如果需要对自定义属性实现动画效果的话,就需要保证自定义属性对应的 getter 和 setter 方法是可被访问的
- 属性动画可以通过 Java 代码或者 xml 文件来实现,定义动画的 xml 文件通常存放在 res/animator 目录下,通过 AnimatorInflater#loadAnimator 加载文件
ValueAnimator
- ValueAnimator 可以用于生成一系列的动画数值变化,但不会直接应用到 view 对象的属性上,而是需要通过监听 ValueAnimator 的更新事件监听器然后在数据回调里进行手动应用
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 100f);
valueAnimator.setDuration(1000);
valueAnimator.setStartDelay(0);
valueAnimator.setRepeatCount(0);
valueAnimator.setRepeatMode(ValueAnimator.RESTART);
valueAnimator.setInterpolator(AccelerateDecelerateInterpolator())
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
view.setTranslationX(value);
}
});
valueAnimator.start();
ObjectAnimator
- ObjectAnimator 继承自 ValueAnimator,可以将计算出来的动画数值直接应用到目标对象的指定属性上,专门用于对 view 对象的特定属性进行动画处理
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "translationX", 0.0F, 100.0F);
objectAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
objectAnimator.setDuration(1000);
objectAnimator.start();
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="translationX"
android:duration="1000"
android:valueFrom="0"
android:valueTo="100"
android:valueType="floatType"/>
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.view_translate);
animator.setTarget(view);
animator.start();
AnimatorSet
ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationX", 0f, 100f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, "translationY", 0f, 100f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(animator1, animator2);
animatorSet.start();
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:ordering="together">
<objectAnimator
android:propertyName="scaleX"
android:duration="1000"
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType" />
<objectAnimator
android:propertyName="scaleY"
android:duration="1000"
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType" />
</set>
Interpolator 插值器
- 用于控制动画的播放速度
- AccelerateDecelerateInterpolator 先加速后减速(默认插值器)
- LinearInterpolator 线性插值器,动画匀速播放
- AccelerateInterpolator 加速插值器,动画开始时速度较慢,逐渐加快
- DecelerateInterpolator 减速插值器,动画开始时速度较快,逐渐减慢
animation.setInterpolator(new AccelerateInterpolator());
AnimatorListener 动画监听器
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) {
}
});