【发布时间】:2021-08-11 18:49:08
【问题描述】:
我的初始屏幕上有一个徽标和两个文件: logo_night.png 和 logo_day.png
如何使用这两个文件更改此徽标,该徽标将根据应用程序的主题而变化?
【问题讨论】:
标签: android kotlin android-drawable
我的初始屏幕上有一个徽标和两个文件: logo_night.png 和 logo_day.png
如何使用这两个文件更改此徽标,该徽标将根据应用程序的主题而变化?
【问题讨论】:
标签: android kotlin android-drawable
通常的方法是使用night 资源限定符,因此如果您使用深色主题,它会从等效的night 文件夹中提取指定资源(如果该文件夹存在)。
我认为你有三个基本选择:
只需将它们都称为logo.png,但将一个版本放在drawable 中,另一个放在drawable-night 中。这样,每当您引用 @drawable/logo 时,它都会根据主题提取正确的版本。如果您有多个密度版本,在drawable-hdpi 等中,您将在drawable-night-hdpi 等中需要它们(限定符顺序很重要)
如果你以通常的方式制作你的启动画面,你创建一个带有背景层的启动画面,而你的徽标可在另一层上绘制,你可以只制作一个 night 的变体(在 drawable-night )。每个版本都可以明确引用logo_day 或logo_night,您可以将这些PNG 保存在普通的drawable 文件夹中
或者您可以制作一个night 版本的初始主题,并将背景显式设置为您的初始可绘制对象的深色版本。您的两个启动画面都可以保留在普通的drawable 文件夹中
所以基本上,必须在night-qualified 资源文件夹中获得一个版本,这样它就可以为暗模式提供替代资源。由您决定要制作该层次结构中的哪个资源的夜间版本(或者您可以根据需要为所有资源制作)。
另外请记住,您的启动主题(如果您这样做的话)遵循系统的暗模式设置。如果您在应用程序中实现切换,并将其设置为暗模式,则如果设备设置为这种模式,则启动画面仍将显示为亮变体。该主题是在您的应用启动之前设置的,并且可以确定它应该处于深色模式还是浅色模式
【讨论】:
由于您使用的是 png 格式。您可以在 context 对象上调用 .getTheme() 来获取当前主题,并使用 if 语句来决定显示哪个 png。
例如在活动中,您可以通过调用getTheme() 来获取主题,因为 this.getTheme() 是隐含的。
另一种可能性是切换到矢量,您可以在其中为不同的主题定义不同的颜色,当用户更改主题时,它们会自动更改。这可能是更好且更具可扩展性的解决方案。您可以找到更多详细信息here。
【讨论】: