如果一个对象需要同时执行多个动画效果,在属性动画中可以借助PropertyValuesHoler
或者AnimatorSet
这两个类来实现,二者相对比AnimatorSet
能力更加强一些.
PropertyValuesHoler的使用
public TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv = ((TextView) findViewById(R.id.tv));
mTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initAnimator();
}
});
}
private void initAnimator() {
PropertyValuesHolder translationX=PropertyValuesHolder.ofFloat("translationX",300f);
PropertyValuesHolder scaleX=PropertyValuesHolder.ofFloat("scaleX",1f,0f,1f);
PropertyValuesHolder scaleY=PropertyValuesHolder.ofFloat("scaleY",1f,0f,1f);
ObjectAnimator animator = ObjectAnimator
.ofPropertyValuesHolder(mTv, translationX, scaleX, scaleY);
animator.setDuration(5000);
animator.start();
}
效果如下,至于动画的效果可以根据实际情况去完成,这里只是说PropertyValuesHoler
这个类如何使用.
AnimatorSet的使用
使用AnimatorSet不仅同样可以完成这样的效果还可以精确的控制某个效果的执行顺序
private void initAnimator() {
ObjectAnimator translationX=ObjectAnimator.ofFloat(mTv,"translationX",300f);
ObjectAnimator scaleX=ObjectAnimator.ofFloat(mTv,"scaleX",1f,0f,1f);
ObjectAnimator scaleY=ObjectAnimator.ofFloat(mTv,"scaleY",1f,0f,1f);
AnimatorSet set=new AnimatorSet();
set.setDuration(5000);
set.playTogether(translationX,scaleX,scaleY);
set.start();
}
这段代码实现效果和上面使用PropertyValuesHoler
一样,从直觉上感觉这个更合理更容易接受些,某些单一的动画放到一个动画容器里,然后一起执行.对于AnimatorSet还有这些常用的方法 playSequentially()
, play().with().before().after()
等来控制动画的协同.
动画监听器
在上面的过程中已经通过addUpdateListener
这个方法为ValueAnimator设置了监听,设置监听的方法有两个一个是addUpdateListener() 另一个是addListener().
如上图所示,因为我们使用较多的是addListener().