文章目录
一、帧动画二、View 动画(补间动画)三、属性动画(Android 3.0)1. valueAnimator2. ObjectAnimator3. 动画的监听4. 组合动画——AnimatorSet5. 组合动画——PropertyValuesHolder6. 在 XML 中使用属性动画
一、帧动画
将一张张单独的图片连贯的进行播放
二、View 动画(补间动画)
动画效果 alpha(淡入淡出) translate(位移) scale(缩放大小) rotate(旋转)
只能够作用在View上,对于非 View 对象不能使用,例如自定义 View 中的 Point 。
只能实现以上几种动画,没有扩展性。
只能改变 View 的效果,不能改变 View 的属性。
三、属性动画(Android 3.0)
参考:Android属性动画完全解析
在 Animator 框架中使用最多的就是 AnimatorSet 和 ObjectAnimator 配合:使用 ObjectAnimator 进行更精细化的控制,控制一个对象和一个属性值,而使用多个 ObjectAnimator 组合到 AnimatorSet 形成一个动画。
1. valueAnimator
本身不提供任何动画效果,它更像一个数值发生器,用来产生有一定规律的数字。负责计算初始值和结束值之间的动画过渡,管理动画的播放次数、播放模式、对动画设置监听等。
ValueAnimator animator
= ValueAnimator
.ofFloat(0f, 1f);
animator
.setDuration(300);
animator
.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation
) {
float currentValue
= (float) animation
.getAnimatedValue();
Log
.d("TAG", "currentValue:" + currentValue
);
}
});
animator
.start();
ValueAnimator animator
= ValueAnimator
.ofFloat(0f, 5f, 3f, 10f);
ValueAnimator animator
= ValueAnimator
.ofInt(0, 100);
设置延迟
animator
.setStartDelay(2000);
循环播放次数
animator
.setRepeatCount(3);
循环播放模式
animator
.setRepeatMode(ValueAnimator
.RESTART
);
animator
.setRepeatMode(ValueAnimator
.REVERSE
);
2. ObjectAnimator
直接对任意对象的任意属性进行动画操作。内部通过反射机制调用 set 方法来修改对象的属性值。继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的。
ObjectAnimator objectAnimator
= ObjectAnimator
.ofFloat(imageView
, "alpha", 1f, 0f, 1f);
objectAnimator
.setDuration(3000);
objectAnimator
.start();
变化属性
ofFloat(textview
, "alpha", 1f, 0f, 1f)
ofFloat(textview
, "rotation", 0f, 360f)
ofFloat(textview
, "rotationX", 0f, 360f)
ofFloat(textview
, "rotationY", 0f, 360f)
ofFloat(imageView
, "translationX", 100f, -500f, 300f)
ofFloat(imageView
, "translationY", 100f, -500f, 300f)
ofFloat(imageView
, "scaleX", 1f, 0.5f, 3f)
ofFloat(imageView
, "scaleY", 1f, 0.5f, 3f)
3. 动画的监听
Animator类当中提供了一个 addListener 方法,ObjectAnimator 继承自 ValueAnimator 的,ValueAnimator 继承自Animator,因此都可以监听。完整的动画具有 start、end、cancel、repeat 四个过程,实现 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
) {
}
});
只需要实现部分方法 AnimatorListenerAdapter
animator
.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation
) {
}
});
4. 组合动画——AnimatorSet
AnimatorSet 类提供了一个 play() 方法,向这个方法中传入一个 Animator 对象(ValueAnimator 或 ObjectAnimator),将会返回一个 AnimatorSet.Builder 的实例。AnimatorSet.Builder 中包括了 4 个方法 after(Animator anim):将现有动画插入到传入的动画之后执行。 after(long delay):将现有动画延迟指定毫秒后执行。 before(Animator anim):将现有动画插入到传入的动画之前执行。 with(Animator anim):将现有动画和传入的动画同时执行。
ObjectAnimator translationX
= ObjectAnimator
.ofFloat(imageView
, "translationX", -300f, 0f);
ObjectAnimator rotation
= ObjectAnimator
.ofFloat(imageView
, "rotation", 0f, 360f);
ObjectAnimator alpha
= ObjectAnimator
.ofFloat(imageView
, "alpha", 1f, 0f, 1f);
AnimatorSet animSet
= new AnimatorSet();
animSet
.play(translationX
).with(rotation
).after(alpha
);
animSet
.setDuration(3000);
animSet
.start();
5. 组合动画——PropertyValuesHolder
相比于 AnimatorSet,PropertyValuesHolder 只能是多个动画同时执行。
PropertyValuesHolder translationX
= PropertyValuesHolder
.ofFloat("translationX", -300f, 0f);
PropertyValuesHolder rotation
= PropertyValuesHolder
.ofFloat("rotation", 0f, 360f);
PropertyValuesHolder alpha
= PropertyValuesHolder
.ofFloat("alpha", 1f, 0f, 1f);
ObjectAnimator animator
= ObjectAnimator
.ofPropertyValuesHolder(imageView
, translationX
, rotation
, alpha
);
animator
.setDuration(3000);
animator
.start();
6. 在 XML 中使用属性动画
属性动画的 xml 文件都应该存放在 animator 文件夹中。XML文件中我们一共可以使用如下三种标签。 <animator> 对应代码中的 ValueAnimator <objectAnimator> 对应代码中的 ObjectAnimator <set> 对应代码中的 AnimatorSet
<animator xmlns
:android
="http://schemas.android.com/apk/res/android"
android
:valueFrom
="0"
android
:valueTo
="100"
android
:valueType
="intType"/>
<objectAnimator xmlns
:android
="http://schemas.android.com/apk/res/android"
android
:valueFrom
="1"
android
:valueTo
="0"
android
:valueType
="floatType"
android
:propertyName
="alpha"/>
<set xmlns
:android
="http://schemas.android.com/apk/res/android"
android
:ordering
="sequentially" >
<objectAnimator
android
:duration
="2000"
android
:propertyName
="translationX"
android
:valueFrom
="-500"
android
:valueTo
="0"
android
:valueType
="floatType" >
</objectAnimator
>
<set android
:ordering
="together" >
<objectAnimator
android
:duration
="3000"
android
:propertyName
="rotation"
android
:valueFrom
="0"
android
:valueTo
="360"
android
:valueType
="floatType" >
</objectAnimator
>
<set android
:ordering
="sequentially" >
<objectAnimator
android
:duration
="1500"
android
:propertyName
="alpha"
android
:valueFrom
="1"
android
:valueTo
="0"
android
:valueType
="floatType" >
</objectAnimator
>
<objectAnimator
android
:duration
="1500"
android
:propertyName
="alpha"
android
:valueFrom
="0"
android
:valueTo
="1"
android
:valueType
="floatType" >
</objectAnimator
>
</set
>
</set
>
</set
>
加载 xml 文件并启动动画 loadAnimator 加载 xml 文件 setTarget 设置到某一个对象上 start 启动动画
Animator animator
= AnimatorInflater
.loadAnimator(context
, R
.animator
.anim_file
);
animator
.setTarget(view
);
animator
.start();