即使不在前景中,如何更改导航栏背景(不仅仅是颜色)?

时间:2016-09-08 05:28:50

标签: android android-navigation-bar

背景

以某种方式应用" Navbar Apps"允许自定义导航栏的背景,即使它不在前景中,甚至不仅仅是简单的颜色。

enter image description here

问题

我认为只有当应用程序位于前台时才能改变它的颜色...

我在一些自定义的roms上看过它,即使在播放音乐时也有特殊效果,但我不知道即使没有自定义ROM(或root)也可以自定义它。

问题

  1. 这是黑客吗?它们如何改变,而不仅仅是导航栏的颜色,甚至为它设置背景图像(包括动态的电池状态)?

  2. 是否也可以更改其他系统栏,例如通知栏?

  3. 如何检查哪个应用程序位于前台(可能需要根据当前应用确定何时更改颜色)?它是一个新的API吗?我认为获取前台活动的API已被弃用,现在无论如何都没有帮助......

1 个答案:

答案 0 :(得分:8)

基本设置非常简单。将它变成一个应用程序将需要一些工作。

您需要使用辅助功能 API以及WindowManager#addView(...)

  

是黑客吗?

我不能说我喜欢这个想法,但它并不是一个黑客。

  

他们如何改变,而不仅仅是导航的颜色   吧,但甚至为它设置了背景图像(包括动态图像,   电池状态)?

由于我们正在添加View(或ViewGroup),因此我们拥有更多控制权。

  

是否也可以更改其他系统栏,例如通知栏?

我会调查一下。

  

如何检查哪个应用程序位于前台(需要决定   何时根据当前的应用程序更改颜色,可能)?

您可以使用辅助功能API来监听Window级别更改(AccessibilityEvent) - 这将为您提供 packageName 。随意使用它。

我将为您提供一些指示:

<强>清单

  • 权限:SYSTEM_ALERT_WINDOW
  • 辅助功能服务声明:<service />

<强> Accessibilityservice

  • 充气,初始化&amp;添加您的布局:onServiceConnected()
  • 我将TYPE_SYSTEM_OVERLAY用于WindowManager#addView(...)
  • 侦听AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
  • 覆盖onAccessibilityEvent(AccessibilityEvent); packageName 将在此处

<强>结果

enter image description here

此处托管了一个示例项目:Link