需求:
1.布局按照上下位置层间隔固定时间播放透明度改变动画
2.播放透明度时播放缩放动画
4.缩放动画执行完成时所有透明度都变为不透明1
效果如下:
实现原理分析:
1.先有将布局按照由上到下层次布局
2.对每一层都添加一个透明度渐变动画
3.按照由上到下层次增加播放延迟时间
4.给整个布局添加一个缩放动画,动画时长为从第一个透明度变化试图开始到最后一个结束
代码实现:
组合动画我们首先要想到AnimatorSet,该对象可以任意组合动画
比如,设置一个AnimatorSet将动画1和动画2同时播放,动画3在动画2结束后播放,动画4则在动画3结束后播放:
AnimatorSet s = new AnimatorSet();
s.play(anim1).with(anim2);
s.play(anim2).before(anim3);
s.play(anim4).after(anim3);
//顺序播放
set.playSequentially(anim1, anim2, anim3);
但是我们实现的效果并不是等某一个都会执行完成后再执行下一个,而是在某一个都会执行一段时间后再执行另一个,这种情况我们就需要知道每一个动画执行时间间隔,在每个动画执行时做一个延迟执行时间。
最终代码实现如下:
public AnimatorSet animatorAlpha(float startAlpha , float targetAlpha){
AnimatorSet set = LauncherAnimUtils.createAnimatorSet();
//所有View按顺序加入List列表
Iterator<View> iterator = animationDisplayOdeer.iterator();
int time = ALPHA_ANIMATION_DELAY_TIME;
//先将每一层View透明度设为0
while (iterator.hasNext()){
View view = iterator.next();
if(view != null && view.getVisibility() == VISIBLE){
view.setAlpha(0);
}
}
iterator = animationDisplayOdeer.iterator();
//给每一个View添加一个透明度动画
while (iterator.hasNext()){
View view = iterator.next();
if(view != null && view.getVisibility() == VISIBLE){
PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", startAlpha , targetAlpha);
ObjectAnimator oa =
LauncherAnimUtils.ofPropertyValuesHolder(view, alpha);
play(set, oa, time, OVER_DISAPLAY_ANIMATIO_NDRUATION);
//累加时间间隔
time +=ALPHA_ANIMATION_DELAY_TIME;
}
}
//给整个View添加一个缩放动画
PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", OVER_DISAPLAY_START_SCALE , OVER_DISAPLAY_END_SCALE);
PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", OVER_DISAPLAY_START_SCALE , OVER_DISAPLAY_END_SCALE);
final ObjectAnimator oa =
LauncherAnimUtils.ofPropertyValuesHolder(this,scaleX, scaleY);
//缩放动画时间
play(set, oa, 0, time);
return set;
}
//将动画添加到AnimatorSet 中
private void play(AnimatorSet as, Animator a, long startDelay, int duration) {
a.setStartDelay(startDelay);
a.setDuration(duration);
as.play(a);
}
总结:
每一个View都添加一个独立的动画并设置各自的setStartDelay时间和setDuration时间并且通过play(a)将动画加入,这里不能给
AnimatorSet设置时间。