java - DrawerLayout 上的动画状态栏颜色 - Material Design

标签 java android

我正在编写一个简单的应用程序来实现符合 Material 设计的抽屉导航,如这篇 Stack 帖子所述:https://stackoverflow.com/a/27153313/1621380

ScrimInsetsFrameLayout 工作得很好,一切都很好,直到我尝试以编程方式更改状态栏的颜色。我的应用使用 Palette API 来动态更改工具栏和状态栏的颜色。

我正在使用 property animation api为工具栏制作动画,效果很好!但我尝试在状态栏上做同样的动画,但它似乎不想做动画。这是一个例子

oh no statusbar!

这是我的动画师的代码:

public static void fadeStatusBar(final DrawerLayout layout, Integer from, Integer to) {
    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), from, to);
        colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animator) {
                layout.setStatusBarBackgroundColor((Integer) animator.getAnimatedValue());
            }

        });
        colorAnimation.start();
    }
}

注意:相同的代码正在淡出工具栏,因此它被证明是有效的。

我的问题是;有谁知道在使用 DrawerLayout.setStatusBarBackgorundColour() 时实现平滑过渡的方法吗?

注意:我使用了 Window 方法 window.setStatusBarColor() 方法,它的动画效果很好,但在拉入 NavDrawer 时会破坏“透明状态栏”。

最佳答案

根据@adneal 对我最初问题的评论,答案是在动画期间使 View 无效。

DrawerLayout calculates the top inset and draws the status bar background itself. So, you just need to make a call to View.invalidate to force it to redraw while the animation is being updated. @adneal

我已经更新了我的代码

ValueAnimator colorAnimation = ValueAnimator.ofArgb(from, to);
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animator) {
        layout.invalidate();
        layout.setStatusBarBackgroundColor((Integer) animator.getAnimatedValue());
    }

});
colorAnimation.start();

对于任何想知道为什么这有效的人,我发现这个堆栈帖子很有启发性:When it's necessary to execute invalidate() on a View?

关于java - DrawerLayout 上的动画状态栏颜色 - Material Design,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27913314/

相关文章:

java - HTTP ERROR 503 服务在 Jetty 服务器中不可用

java - teamcity - 无法构建maven项目包X不存在

java - takePicture 因堆相关错误而失败

java - 错误 :The processing instruction target matching "[xX][mM][lL]" is not allowed

android - 经度和纬度的双值未传递给 googlemap 标记

java - 使用 Mockito 执行单元测试时出现 NullPointerException

java - Spring Web 服务客户端使用智能卡签名

android - 删除所有语言的字符串 Android

带有 2 个图像的 Android 布局在底部留下空白

java - TCP:如何从 Android 客户端中的 Vb.net 服务器获得响应?