【问题标题】:Pause in AnimatorSet played sequentiallyAnimatorSet 中的暂停按顺序播放
【发布时间】:2016-03-07 13:23:48
【问题描述】:

我需要将以下动画应用到 imageView:

1. alpha (0 -> 1) and scale (0 -> 1) in 500ms
2. pause for 1000ms
3. alpha (1 -> 0) and scale (1 -> 0) in 500ms

在我看来,这三个Animators 可以用AnimatorSet 顺序播放。

我写了这段代码,其中三个块已经清楚地分开了:

ObjectAnimator alpha1 = ObjectAnimator.ofFloat(imageView, View.ALPHA, 0f, 1f);
ObjectAnimator scaleX1 = ObjectAnimator.ofFloat(imageView, View.SCALE_X, 0f, 1f);
ObjectAnimator scaleY1 = ObjectAnimator.ofFloat(imageView, View.SCALE_Y, 0f, 1f);
AnimatorSet part1 = new AnimatorSet();
part1.setInterpolator(new OvershootInterpolator());
part1.setDuration(500);
part1.playTogether(alpha1, scaleX1, scaleY1);

ObjectAnimator pause = ObjectAnimator.ofFloat(imageView, View.ALPHA, 1f);
pause.setDuration(1000);

ObjectAnimator alpha0 = ObjectAnimator.ofFloat(imageView, View.ALPHA, 1f, 0f);
ObjectAnimator scaleX0 = ObjectAnimator.ofFloat(imageView, View.SCALE_X, 1f, 0f);
ObjectAnimator scaleY0 = ObjectAnimator.ofFloat(imageView, View.SCALE_Y, 1f, 0f);
AnimatorSet part2 = new AnimatorSet();
part2.setInterpolator(new AccelerateDecelerateInterpolator());
part2.setDuration(500);
part2.playTogether(alpha0, scaleX0, scaleY0);

在我看来,这段代码很清晰,比有计时器或监听器要好。 主要问题是,有没有一种“PauseAnimator可以在类似情况下使用? (实际上第二段代码什么都不做,它在 1000 毫秒内将 alpha 从 1 设置为 1)

【问题讨论】:

    标签: android animation objectanimator


    【解决方案1】:

    setStartDelay() 方法可用于此目的。此外,PropertyValuesHolder 可用于同时为视图的不同属性设置动画。

    以下是高层次的步骤:

    1. 设置 objectAnimator1 以动画方式并行提升 alpha 和放大 x 和 y
    2. 设置 objectAnimator2 以并行设置动画,降低 alpha 并缩小 x 和 y 并具有启动延迟
    3. 使用 AnimatorSet 为 objectAnimator1 和 objectAnimator2 按顺序设置动画。

    这里是代码:我这里的视图是一个名为“mTextView”的文本视图

    // objectAnimator1 stuff
    PropertyValuesHolder pvhToRaiseAlpha = PropertyValuesHolder.ofFloat("alpha", 0f, 1.0f);
    PropertyValuesHolder pvhForxUpscale = PropertyValuesHolder.ofFloat("scaleX", 0f, 1.0f);
    PropertyValuesHolder pvhForyUpscale = PropertyValuesHolder.ofFloat("scaleY", 0f, 1.0f);
    ObjectAnimator objectAnimator1 = ObjectAnimator.ofPropertyValuesHolder(mTextView, pvhToRaiseAlpha, pvhForxUpscale, pvhForyUpscale);
    objectAnimator1.setDuration(500);
    
    // objectAnimator2 stuff
    PropertyValuesHolder pvhToLowerAlpha = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0f);
    PropertyValuesHolder pvhForxDownscale = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0f);
    PropertyValuesHolder pvhForyDownscale = PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0f);
    ObjectAnimator objectAnimator2 = ObjectAnimator.ofPropertyValuesHolder(mTextView, pvhToLowerAlpha, pvhForxDownscale, pvhForyDownscale);
    objectAnimator2.setDuration(500);
    objectAnimator2.setStartDelay(1000);
    
    // AnimatorSet stuff
    AnimatorSet sequenceAnimator = new AnimatorSet();
    sequenceAnimator.playSequentially(objectAnimator1, objectAnimator2);
    sequenceAnimator.start();
    

    【讨论】:

    • 问题不是动画本身,而是在两个阶段之间暂停指定时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多