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

and*_*per 16 android android-navigation-bar

背景

不知何故,应用程序" Navbar Apps "允许自定义导航栏的背景,即使它不在前景中,甚至不仅仅是简单的颜色.

在此输入图像描述

问题

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

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

问题

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

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

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

Vik*_*ram 8

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

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

这是一个黑客?

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

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

由于我们添加了View(或ViewGroup),我们有更多的控制权.

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

我会调查一下.

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

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

我会给你一些指示:

清单:

  • 允许: SYSTEM_ALERT_WINDOW
  • 无障碍服务声明: <service />

Accessibilityservice

  • 膨胀,初始化和添加您的布局: onServiceConnected()
  • 我用TYPE_SYSTEM_OVERLAYWindowManager#addView(...)
  • 侦听AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
  • 覆盖onAccessibilityEvent(AccessibilityEvent); packageName将在这里提供

结果

在此输入图像描述

这里托管了一个示例项目:链接.

  • @androiddeveloper是的,该解决方案使用`SYSTEM_ALERT_WINDOW`.使用`FLAG_LAYOUT_NO_LIMITS`和'Gravity.BOTTOM`,您可以将视图定位在屏幕上的任何位置."AccessibilityService"由系统管理,并由用户管理__enabled/disabled__.换句话说,您(作为开发人员)将不会启动/停止服务. (2认同)
  • @androiddeveloper这只是一个概念证明.有一些片状API可以告诉您设备上是否存在导航栏 - 请参阅[此](http://stackoverflow.com/questions/16092431/check-for-navigation-bar).导航栏的方向 - 见[this](http://stackoverflow.com/questions/21057035/detect-android-navigation-bar-orientation).这只是我的观点 - 但是对于这些类型的应用程序,您可以针对常见情况进行设计,并在报告错误时改进代码.从"NavBar Apps"评论和Google+信息页中可以看出这一点. (2认同)