AnimatorSet组合按照时间间隔同步播放动画

需求:

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设置时间。
发布了92 篇原创文章 · 获赞 27 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/zhuxingchong/article/details/100125818