安卓 alpha动画淡入淡出及延时

40

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

这个想法是对一个视图执行以下动画:

  1. 在1秒内将alpha从0变为1
  2. 将alpha保持在1,持续5秒
  3. 在1秒内将alpha从1变为0
  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);

但似乎第三个动画会对所有透明度动画造成混乱,我认为这会导致Android处理这种类型的动画时出现内部不一致。

有任何想法吗?

谢谢。


请问我的代码是否运行良好?如果是,请接受答案。 - Sherif elKhatib
4个回答

113

请记住以下两点来解决这个问题:


  • 如果我想在5秒后以1秒的动画持续时间将1.0f to 0.0f进行动画,那么这实际上是一个有5秒暂停时间的1秒动画。

    为了实现这一点:

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

  • 你只需要两个无限循环的动画。

    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);

完美的答案!非常感谢! - David
它能够等待5秒后展示一些东西吗?为了使用handler.post延迟。 - mehmet

20

这个问题其实有一个更简单的解决方案。

假设你的视图状态是 GONE。为了将其动画显示:

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

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

对于缩放和平移动画也同样适用。


1
请尝试此代码。
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值即可。

0
在我的解决方案中,我使用了一个通用的视图内部的动画工具函数,并通过内联定义值的方式实现了这一点。
fun View.fadeIn(durationMillis: Long = 250, delay: Long = 1000) {
    this.startAnimation(AlphaAnimation(0F, 1F).apply {
        duration = durationMillis
        startOffset = delay
        fillAfter = true
    })
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接