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

标签 android android-navigation-bar

背景

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

enter image description here

问题

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

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

问题

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

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

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

最佳答案

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

您需要使用 Accessibility API 以及 WindowManager#addView(...) .

Is it a hack?

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

How do they change, not just the color of the navigation bar, but even set a background image for it (including dynamic one, for battery status) ?

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

Is it also possible to change other system bars, like the notification bar?

我会调查的。

How does it check which app is in the foreground (needed for deciding when to change the color, based on current app, probably)?

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

我会给你一些指点:

list :

  • 权限:SYSTEM_ALERT_WINDOW
  • 无障碍服务声明:<service />

无障碍服务

  • 膨胀、初始化和添加您的布局:onServiceConnected()
  • 我使用了 TYPE_SYSTEM_OVERLAYWindowManager#addView(...)
  • 监听 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
  • 覆盖 onAccessibilityEvent(AccessibilityEvent) ; packageName 将在此处提供

结果

enter image description here

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

关于android - 即使不在前景中,您如何更改导航栏背景(不仅仅是颜色)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39383183/

相关文章:

java - 在底部导航栏中添加项目

android - SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 不适用于 API 28

java - 自定义带有底栏的android布局?

java - 谷歌地图 API v2 有什么问题?

java - 如何检查字符串的字符集是否与设备设置语言的字符集相同

java - Dagger Hilt 测试错误 - 错误 : cannot find symbol @ScopeMetadata, @QualifierMetadata

android - ScrollView android 中的 Horizo​​ntalScrollView

android - 捕获android webview图像并保存为png/jpeg