一、Property Animation介绍
属性动画可以对任何对象的属性进行动画(包括view),动画默认时间为300ms,默认帧率10ms/帧。在一个时间间隔内完成从一个属性值到另一个属性值得改变。
属性动画是API11才有,之前的版本无法直接使用,可以采用开源动画库nineoldandroids来兼容以前的版本。
2、属相动画相关的类
类名 | 用途 |
ValueAnimator | 属性动画主要的计时器,也计算动画后的属性的值,动画的执行类 |
ObjectAnimation | ValueAnimation的一个子类,动画的执行类 |
AnimatorSet | 动画集合 |
AnimatorInflater | 用户加载属性动画的xml |
Evaluators | 属性动画计算器,告诉了属性动画系统如何计算给出属性的值 |
Interpolators | 动画插值器 |
关系图:
3、相关属性介绍
名称 | 解析 | 值 |
propertyName | 属性名 | alpha;scaleX;scaleY;rotate;translationX;translationY |
duration | 时长 | |
valueFrom | 属性的起始值 | |
valueTo |
属性的结束值 |
|
startOffset | 动画延迟时间 | |
repeatCount | 动画重复次数 | |
repeatMode | 重复模式 | |
valueType | 属性的类型 | floatType,colorType,intType,pathType |
ordering | 顺序(集合中使用) | together,sequentially |
二、属性动画
1、ObjectAnimator
ObjectAnimator是ValueAnimator的子类。
(1)xml实现方式
//定义
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:propertyName="alpha"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="200"
android:valueFrom="0.0"
android:valueTo="1.0"
android:valueType="floatType" />
//使用
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.anim);
anim.setTarget(imageView);
anim.start();
- xml文件在res/animator/文件夹下,根节点是objectAnimatior
(2)ObjectAnimatior类实现
ObjectAnimator scaleXAnimator = ObjectAnimator.ofInt(img, "backgroundColor",
Color.parseColor("#ffffff"), Color.parseColor("#000000"));
scaleXAnimator.setDuration(5000);
scaleXAnimator.setEvaluator(new ArgbEvaluator());
scaleXAnimator.start();
2、ValueAnimator
(1)xml实现方式
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fillAfter="true"
android:propertyName="scaleY"
android:valueFrom="1"
android:valueTo="5"
android:valueType="floatType"/>
//使用
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.set);
anim.setTarget(imageView);
anim.start();
- xml文件在res/animator/文件夹下,根节点是animatior
3、AnimatorSet
(1)xml实现方式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:duration="5000"
android:fillAfter="true"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="5"
android:valueType="floatType" />
<animator
android:duration="5000"
android:fillAfter="true"
android:propertyName="scaleY"
android:valueFrom="1"
android:valueTo="5"
android:valueType="floatType" />
</set>
//使用
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.set);
anim.setTarget(imageView);
anim.start();
- xml文件在res/animator/文件夹下,根节点是set
(2)AnimatorSet类实现
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 1.5f);
scaleXAnimator.setDuration(500);
scaleXAnimator.setRepeatCount(1);
scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 1.5f);
scaleYAnimator.setDuration(500);
scaleYAnimator.setRepeatCount(1);
scaleYAnimator.setRepeatMode(ValueAnimator.REVERSE);
animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
animatorSet.start();
(3)动画集合的播放方式
- playTogether 同时执行
animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
animatorSet.start();
- 通过play函数返回Animator.Builder的实例,设置播放方式
AnimatorSet animatorSet = new AnimatorSet();
AnimatorSet.Builder play = animatorSet.play(animator1);
play.after(animator2);//将现有动画插入到传入的动画之后执行
play.with(animator2);//将现有动画和传入的动画同时执行
play.before(animator2);//将现有动画插入到传入的动画之前执行
animatorSet.start();
- 依次播放方式
animatorSet.playSequentially(animator1,animator2);//依次执行
animatorSet.start();
4、添加动画监听
new ObjectAnimator().addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//TODO 动画开始前的操作
}
@Override
public void onAnimationEnd(Animator animation) {
//TODO 动画结束的操作
}
@Override
public void onAnimationCancel(Animator animation) {
//TODO 动画取消的操作
}
@Override
public void onAnimationRepeat(Animator animation) {
//TODO 动画重复的操作
}
});
5、监听简单动画执行过程中的变化
new ObjectAnimator().addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
}
});
三、属性动画的原理
来源:CSDN
作者:影子听说
链接:https://blog.csdn.net/u011275346/article/details/88414620