Android 如果 alpha 最初为零,则不会对其进行动画处理

Android doesn't animate alpha if it's initially zero

我正在尝试为 Android 视图制作 alpha 动画(两个动画,淡入和淡出)。默认情况下,如果视图的 alpha 最初为 1,则一切正常。但是,我希望该视图最初是透明的,因此我将其 alpha 设置为零:

indicatorContainer.setAlpha(0);

现在,动画将无法运行。它永远不会变得可见。如果我注释掉该行,最初会显示该视图(我不想要),但是当我调用它们时我的动画效果很好。我虽然这是微不足道的事情,但显然不是。我做错了什么?

更新: 在阅读了一些 API 涉及 setAlpha方法,以为我的调用可能调用了不正确的重载,但没有任何改变。

尝试这样的事情:

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

我遇到了同样的问题,其中 indicatorContainerImageButton。 下面的代码修复了这个非常非常烦人的问题...

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

大家可以试试下面这种更简单的方法:

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

这是我解决这个问题的方法 - 不是特别优雅,但易于管理

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

  2. 当事件发生时您需要视图具有更多(或更少)visibility/alpha - 例如,就在您开始动画之前 - 此时您可以更新 alpha 和然后运行视图上的动画

当动画重复时,我仍然感到有些不稳定,但这种方法可能适用于动画不重复的场景

这可能与 OP 无关,但我想无论如何我都会分享它,因为它可能会在未来帮助别人。

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

我遇到了这个 SO post 认为将 alpha 设置回 1.0f 是失败的,但实际上它仍在正常工作,但动画是在屏幕外发生的,因为我没有't 重置我的 Y 轴平移 (Homer Simpson *doh* moment)。

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

在我遇到的场景中,我希望动画向下浮动并淡出,因此相应地调整了 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,它会按预期工作。