16

背景

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

在此处输入图像描述

问题

我认为只能更改它的颜色,并且只有当应用程序处于前台时...

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

问题

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

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

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

4

1 回答 1

8

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

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

是黑客吗?

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

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

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

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

我会调查一下。

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

您可以使用 Accessibility API 来监听Window级别更改 ( AccessibilityEvent) - 这将为您提供packageName。随心所欲地使用它。

我会给你一些建议:

清单

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

无障碍服务

  • 膨胀,初始化和添加你的布局:onServiceConnected()
  • TYPE_SYSTEM_OVERLAY我用过WindowManager#addView(...)
  • 监听 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
  • 覆盖onAccessibilityEvent(AccessibilityEvent)packageName将在此处提供

结果

在此处输入图像描述

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

于 2016-10-07T21:41:15.733 回答