Android alpha动画fadein fadeout有延迟

时间:2010-07-21 10:40:44

标签: android animation alpha fadein fadeout

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

我们的想法是在视图上执行此动画:

  1. alpha从0到1的1秒
  2. 将alpha保持为1,持续5秒
  3. alpha从1到0的1秒
  4. 将alpha保持为0持续5秒。
  5. 从1开始。
  6. 我尝试用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);
    

    等。

    但它接第三个动画与所有alpha动画混乱,我认为这会导致Android管理此类动画的内部不连贯。

    有什么想法吗?

    谢谢。

3 个答案:

答案 0 :(得分:105)

Ok请记住这两点来解决这个问题


  • 如果我想在动画持续时间为1秒的5秒钟后为1.0f to 0.0f设置动画,则最终为1秒动画,暂停时间为5秒。

    要实现这个目标:

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

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

    1. 0.0f to 1.0f暂停5秒,持续时间1秒

    2. 1.0f to 0.0f暂停5秒,持续时间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);

答案 1 :(得分:17)

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

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

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

通过相同的方式,您可以添加动画侦听器。

这也适用于缩放和翻译动画。

答案 2 :(得分: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值即可。