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);
}
});
我遇到了同样的问题,其中 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);
大家可以试试下面这种更简单的方法:
view.animate().alpha(1).setDuration(ANIMATION_DURATION);
这是我解决这个问题的方法 - 不是特别优雅,但易于管理:
将视图设置为您想要的初始 alpha 0.0f 或其他。
当事件发生时您需要视图具有更多(或更少)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
,它会按预期工作。
我正在尝试为 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);
}
});
我遇到了同样的问题,其中 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);
大家可以试试下面这种更简单的方法:
view.animate().alpha(1).setDuration(ANIMATION_DURATION);
这是我解决这个问题的方法 - 不是特别优雅,但易于管理:
将视图设置为您想要的初始 alpha 0.0f 或其他。
当事件发生时您需要视图具有更多(或更少)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
,它会按预期工作。