常用的做法:
一般情况下为了将程序UI和处理逻辑分开,降低耦合度,需要将动画实现在xml文件中,方便动画重用。
动画xml文件放在res/anim目录下
- ValueAnimator对应xml文件的<animator>标签
- ObjectAnimator对应<objectAnimator>
- AnimatorSet对应<set>
第一步,创建动画文件
<set android:ordering="sequentially">
<set>
<objectAnimator
android:propertyName="x"
android:duration="500"
android:valueTo="400"
android:valueType="intType"/>
<objectAnimator
android:propertyName="y"
android:duration="500"
android:valueTo="300"
android:valueType="intType"/>
</set>
<objectAnimator
android:propertyName="alpha"
android:duration="500"
android:valueTo="1f"/>
<animator
android:duration="1000"
android:valueFrom="0"
android:valueTo="100"
android:valueType="intType"/>
</set>
动画按顺序播放,先一起播放<set>里面的objectAnimator,接着播放另外一个objectAnimator。
第二步,把动画文件运用到相应的对象上
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.anim.property_animator);
set.setTarget(myObject);
set.start();
需要使用AnimatorInflater载入xml文件并转换为AnimatorSet类型,然后设置到需要增加动画效果的对象,调用start()方法启动动画。
我们注意到<set>标签里的<animator>实际上是不会表现到UI上的,这就要用到前面讲的知识,需要对这个valueanimator绑定一个listener,具体可以参考下面的做法
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.anim.property_animator);
ArrayList<Animator> animators = set.getChildAnimations();//得到animatorSet控制的子动画
ValueAnimator animator = (ValueAnimator)animators.get(2);//获取第三个动画,转化为ValueAnimator类型
animator.addUpdateListener(new MyUpdateListener()); //绑定updateListener
set.setTarget(myObject);
set.start();
//自己的UpdateListener, 在onAnimationUpdate里更新Ui
private class MyUpdateListener implements ValueAnimator.AnimatorUpdateListener {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
// TODO Auto-generated method stub
...
}
}