属性动画的XML实现
补间动画的四种动画都可以通过代码实现,也可以通过xml实现,详见《补间动画:Tween Animation》。属性动画也可以通过XML的方式快速实现。和Animation动画src/main/res/anim目录不同,Animator动画xml放在src/main/res/animator目录下。
1、ValueAnimator
<animator/>标签对应ValueAnimator属性动画。关于ValueAnimator详见《属性动画:ValueAnimator及其监听器》。
1.1、ValueAnimator XML标签
ValueAnimator的xml有哪些属性呢?一共如下八个。
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="属性动画时长"
android:interpolator="插值器"
android:repeatCount="动画重复次数"
android:repeatMode="reverse|restart"
android:startOffset="动画激活延时;对应代码中的startDelay(long delay)函数"
android:valueFrom="初始动化值"
android:valueTo="动画结束值;取值范围同样是float,int和color这三种类型的值"
android:valueType="floatType|intType|pathType|colorType:valueFrom和valueTo的类型" />1.2、示例
在src/main/res/animator目录下定义ValueAnimator动画
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1500"
android:interpolator="@android:anim/accelerate_interpolator"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="100"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />通过AnimatorInflater加载animator动画XML文件
ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.value_animator);ValueAnimator还是需要添加监听器在回调中实时的设置View
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
//最好不要在这里创建对象,复用的对象移除调用栈外创建
DecimalFormat decimalFormat = new DecimalFormat("0.00");
mTextView.setText(decimalFormat.format(value));
}
});设置完成之后就可以开始执行属性动画。
valueAnimator.start();
2、ObjectAnimator
<objectAnimator/>标签对应ObjectAnimator属性动画。关于ObjectAnimator详见《属性动画:ObjectAnimator基础》。
2.1、ObjectAnimator标签
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="动画时长"
android:interpolator="interpolator"
android:pathData="用于对ObjectAnimator中的属性进行动画处理的路径。"
android:propertyName="对应属性名"
android:propertyXName="被动画化为pathData的X坐标的属性的名称。"
android:propertyYName="被动画化为pathData的Y坐标的属性的名称。"
android:repeatCount="动画重复次数"
android:repeatMode="restart|reverse"
android:startOffset="动画延时"
android:valueFrom="初始动化值"
android:valueTo="动画结束值"
android:valueType="floatType|intType||pathType|colorType" />2.2、示例
先在res/animator/目录下创建ObjectAnimator动画XML文件,使用<objectAnimator/>标签
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1500"
android:interpolator="@android:anim/accelerate_interpolator"
android:propertyName="backgroundColor"
android:repeatCount="0"
android:repeatMode="restart"
android:startOffset="100"
android:valueFrom="@color/colorAccent"
android:valueTo="@color/colorPrimary"
android:valueType="colorType" />通过AnimatorInflater加载并类型转换为ObjectAnimator
ObjectAnimator objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.object_animator);还没有设置对象target View,将该ObjectAnimator用于TextView,并开始
objectAnimator.setTarget(mTextView);
objectAnimator.start();
3、AnimatorSet
<set/>标签对应AnimatorSet属性动画。关于AnimatorSet详见《属性动画集合:AnimatorSet》。
3.1、属性
AnimatorSet的XML文件只有一个属性android:ordering:together表示同时开始动画,sequentially表示逐个开始动画。
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together|sequentially">
...
</set>3.2、示例
AnimatorSet的XML中添加属性动画,但是这里有一个小问题:由于一次性加载整个动画文件,如果是ValueAnimator和ObjectAnimator混搭的AnimatorSet,那么其中的ValueAnimator就无法单独设置AnimatorUpdateListener而不起作用。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<animator
android:duration="1500"
android:interpolator="@android:anim/accelerate_interpolator"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="100"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
<objectAnimator
android:duration="1500"
android:interpolator="@android:anim/accelerate_interpolator"
android:propertyName="backgroundColor"
android:repeatCount="0"
android:repeatMode="restart"
android:startOffset="100"
android:valueFrom="@color/colorAccent"
android:valueTo="@color/colorPrimary"
android:valueType="colorType" />
</set>加载XML定义的AnimatorSet属性动画集合
AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.set_animator);需要设置统一的target给其中的ObjectAnimator,至于AnimatorSet中的ValueAnimator就没办法再单独设置AnimatorUpdateListener。所以XML定义AnimatorSet最好还是全部都添加ObjectAnimator子动画。
animatorSet.setTarget(mTextView);
animatorSet.start();
