38

我想做一个非常简单的 alpha 动画,但我找不到有效的方法。

这个想法是在一个视图上执行这个动画:

  1. alpha 从 0 到 1 的 1 秒
  2. 将 alpha 保持在 1 5 秒
  3. alpha 从 1 到 0 的 1 秒
  4. 将 alpha 保持在 0 5 秒。
  5. 从1重新开始。

我尝试使用 AnimationSet 将其实现为:

AnimationSet animationSet = new AnimationSet(true);

Animation animation1 = new AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
animation1.setDuration(1000);

Animation animation2 = new AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
animation2.setDuration(1000);
animation2.setStartOffset(5000);

Animation animation3 = new AlphaAnimation(0.0f, 0.0f);
animation3.setDuration(4000)
animation3.setStartOffset(6000);

animationSet.add(animation1);
animationSet.add(animation2);
animationSet.add(animation3);

ETC..

但似乎第三个动画与所有 alpha 动画都混在一起了,我认为这会导致 Android 管理此类动画的方式出现内部不连贯性。

任何的想法?

谢谢你。

4

3 回答 3

109

好的记住这两点来解决这个问题


  • 如果我想1.0f to 0.0f在 5 秒后以 1 秒的动画持续时间制作动画,这最终是一个 1 秒的动画,暂停为 5 秒。

    要实现这一点:

    1. setDuration(1000)(持续时间为 1 秒)
    2. setStartOffset(5000)(它将在 5 秒后开始)

  • 您只需要 2 个将永远循环播放的动画。

    1. 0.0f to 1.0f5 秒暂停和 1 秒持续时间

    2. 1.0f to 0.0f5 秒暂停和 1 秒持续时间


这是代码:

    animation1 = new AlphaAnimation(0.0f, 1.0f);
    animation1.setDuration(1000);
    animation1.setStartOffset(5000);

    animation2 = new AlphaAnimation(1.0f, 0.0f);
    animation2.setDuration(1000);
    animation2.setStartOffset(5000);

    textView.startAnimation(animation1);

但是要永远循环,我会使用AnimationListener,因为 repeatCount 是错误的:

    animation1 = new AlphaAnimation(0.0f, 1.0f);
    animation1.setDuration(1000);
    animation1.setStartOffset(5000);

    //animation1 AnimationListener
    animation1.setAnimationListener(new AnimationListener(){

        @Override
        public void onAnimationEnd(Animation arg0) {
            // start animation2 when animation1 ends (continue)
            textView.startAnimation(animation2);
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation arg0) {
            // TODO Auto-generated method stub

        }

    });

    animation2 = new AlphaAnimation(1.0f, 0.0f);
    animation2.setDuration(1000);
    animation2.setStartOffset(5000);

    //animation2 AnimationListener
    animation2.setAnimationListener(new AnimationListener(){

        @Override
        public void onAnimationEnd(Animation arg0) {
            // start animation1 when animation2 ends (repeat)
            textView.startAnimation(animation1);
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation arg0) {
            // TODO Auto-generated method stub

        }

    });

    textView.startAnimation(animation1);
于 2011-08-15T16:18:05.790 回答
20

有一个更简单的解决方案。

让我们假设您的视图处于 GONE 状态。动画到它的可见性:

yourView.setVisibility(View.VISIBLE);
yourView.animate().alpha(1).setDuration(300);

通过同样的方式你可以添加动画监听器。

这也适用于缩放和平移动画。

于 2016-08-30T17:40:27.690 回答
0

试试这个

val shortAnimationDuration = 1000
            yourView.apply {
                alpha = 0f
                animate()
                    .alpha(1f)
                    .setDuration(shortAnimationDuration.toLong())
                    .setListener(object :AnimatorListenerAdapter(){
                        override fun onAnimationEnd(animation: Animator?) {
                           //You can add what you want to do after completing animation
                        }
                    })
            }

这是一个淡入淡出的动画。如果你想淡出你只需交换 alpha 值。

于 2020-04-24T13:57:49.113 回答