Android不会在初始值为零的情况下对Alpha进行动画处理。

22

我正在尝试对Android视图的 alpha 进行动画处理(两个动画,都是淡入和淡出)。如果视图的 alpha 最初为 1(默认值),则一切正常。然而,我希望该视图最初是透明的,因此我将其 alpha 设置为零:

indicatorContainer.setAlpha(0);

现在,动画将无法工作,它永远不会变得可见。如果我注释掉那一行,视图最初将显示(我不想要这个),但当我调用它们时,我的动画工作正常。我以为这很简单,但显然不是这样。我做错了什么?

更新:我还尝试了浮点数 0f 而不是整数 0,在阅读了一些涉及 setAlpha 方法的 API 更改后,我认为我的调用可能会调用错误的重载方法,但是并没有改变任何东西。

5个回答

13

尝试像这样做:

  mRelativeLayout.setAlpha(0f);
    mRelativeLayout.animate().alpha(1f).setDuration(500).setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            mRelativeLayout.setVisibility(View.VISIBLE);
            //OR
            mRelativeLayout.setAlpha(1f);
        }
    });

1
我之前使用了这样的简单动画:Animation animation = new AlphaAnimation(indicatorContainer.getAlpha(), 1f); animation.setFillAfter(true); animation.setDuration(200); indicatorContainer.startAnimation(animation); 难道没有其他方法吗? - Can Poyrazoğlu
1
尝试在布局XML中将可见性属性设置为不可见。在开始Alpha动画之前,调用(您的视图)。setVisibility(View.VISIBLE); - Nikhil Verma
它以那种方式运行了...你知道为什么它没起作用吗? - Can Poyrazoğlu

3

我曾面临同样的问题,其中indicatorContainer是一个ImageButton。 下面的代码可以解决这个非常让人烦恼的问题...

// XXX: Does not work if just 0. It calls `ImageView#setAlpha(int)` deprecated method.
indicatorContainer.setAlpha(0.0f);
ViewCompat.animate(indicatorContainer).alpha(1);

1
回复内容存在敏感词^**$ way:

view.animate().alpha(1).setDuration(ANIMATION_DURATION);


1

这可能与OP无关,但我想分享一下,因为它可能会帮助未来的某个人。

请注意,如果您的初始动画将animate().alpha(0.0f)与视图的Y或X轴平移操作(例如animate().translationYBy(500)结合在一起,则必须在淡入之前重置此属性(使用animate().alpha(1.0f))。

我遇到了这个SO帖子,以为将alpha设置回1.0f会失败,但实际上它仍然像应该一样工作,只是动画出现在屏幕外,因为我没有重置我的Y轴平移(Homer Simpson *doh* moment)。

方便的是,为了轻松解决此问题,您可以添加一个AnimatorEndListener到您的动画中,以在完成时执行(如@Nikhil Verma上面所提到的),在其中添加一行代码以重置X/Y轴平移。

在我所面临的情况下,我希望动画向下浮动并淡出,因此相应地调整了Y轴和alpha。在它浮动并消失后,我设置了一个监听器来重置Y轴平移,如下所示:

 loadingMask.animate().translationYBy(500); //starts animation by moving it down the screen
        loadingMask.animate().alpha(0.0f) //fades out
        .setDuration(1500) //over 1.5s
        .setListener(new AnimatorEndListener() { //when animation completes
            @Override
            public void onAnimationEnd(Animator animation) {
                loadingMask.setTranslationY(0); //reset the y axis translation
            }
        });

现在,当我想要动画再次重复时,我可以将我的视图的 alpha 设置为 1.0f,这样它就能按预期工作了。

0

以下是我如何解决这个问题的方法 - 不是特别优雅,但可行:

  1. 将视图设置为您想要的初始 alpha 值 0.0f 或其他值。

  2. 当发生需要视图具有更多(或更少)可见性/alpha 的事件时 - 例如,在开始动画之前的那一刻 - 您可以在该点更新 alpha,然后在视图上运行动画

当动画重复时,仍会出现一些卡顿,但这种方法可能适用于不重复动画的情况


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