导航回来时,Android工具栏变得半透明

时间:2015-05-27 22:26:36

标签: android android-appcompat android-toolbar

示例项目说明问题

https://github.com/justincpollard/TransparentToolbarExample

背景

我们有一个Activity / Fragment组合用于在我们的应用中显示内容。我们的用户可以在多个内容之间进行导航,这些内容基本上将这些Activity / Fragment个组合放在另一个上面。点击硬件后退按钮或向上按钮只会显示前一段内容。

以下引用示例项目

当用户正在查看内容时,工具栏(android.support.v7.widget.Toolbar)及其文本开始透明。我们这样完成:

public void onCreateView(...) {
    ...
    toolbar = (Toolbar) v.findViewById(R.id.toolbar);
    ...
    actionBarDrawable = toolbar.getBackground();
    actionBarDrawable.setAlpha(0);
    actionBarText.setTextColor(Color.argb(0, 255, 255, 255));
    ...
}

如果用户滚过页面上的某个点,例如滚动一个等于工具栏高度的数量,我们为工具栏背景的alpha设置动画。从0到255的文本,基本上揭示了工具栏:

private void animateToolbar(final int start, final int finish) {
    toolbarIsAnimating = true;
    ValueAnimator animator = ValueAnimator.ofInt(start, finish);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator animation) {
         toolbarAlpha = (int) animation.getAnimatedValue();
         actionBarDrawable.setAlpha(toolbarAlpha);
         actionBarText.setTextColor(Color.argb(toolbarAlpha, 255, 255, 255));
        if(toolbarAlpha == finish) {
          toolbarIsAnimating = false;
        }
       }
    });
    animator.setInterpolator(new DecelerateInterpolator());
    animator.setDuration(300);
    animator.start();
}

问题

当用户在滚动超过阈值点之后从原始内容导航到另一条内容(即工具栏背景已动画进入视图)时,向后/向上按下会显示原始Activity / { {1}}组合,但工具栏完全透明。

要在示例项目中进行说明,请构建并打开应用程序,滚动到页面底部,然后按“更多内容”按钮。导航到第二个Fragment后,按后退按钮。请注意,工具栏是透明的,但标题文本仍然可见。

之前有没有人见过这个问题?我只在Android 5. +上看过它,但随着5. +的采用继续增长,这将成为一个更大的问题。

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

找到解决方案:

而不是

toolbar.getBackground().setAlpha();

您需要使用

toolbar.getBackground().mutate().setAlpha();

显然,drawables默认情况下彼此共享状态,调用mutate()会使这个特殊的drawable不共享状态。

答案 1 :(得分:0)

好笑,@ Gricher和我在同一时间遇到了答案。我没有审查他的答案,但这是我的:

无需处理Drawable返回的toolbar.getBackground()。您可以通过使用与我用于更改操作栏文本颜色的类似技术来完成相同的操作。

将此用于animateToolbar()方法:

private void animateToolbar(final int start, final int finish) {
    toolbarIsAnimating = true;
    ValueAnimator animator = ValueAnimator.ofInt(start, finish);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator animation) {
         toolbarAlpha = (int) animation.getAnimatedValue();
         toolbar.setBackgroundColor(Color.argb(toolbarAlpha, 56, 204, 255));
         actionBarText.setTextColor(Color.argb(toolbarAlpha, 255, 255, 255));
        if(toolbarAlpha == finish) {
          toolbarIsAnimating = false;
        }
       }
    });
    animator.setInterpolator(new DecelerateInterpolator());
    animator.setDuration(300);
    animator.start();
  }

关键是:

toolbar.setBackgroundColor(Color.argb(toolbarAlpha, 56, 204, 255));

适用于Android 6. +(现在也是如此)。