5

所以,老板让我从Android 12开始分析如何实现Material You颜色。我一直在研究它,每一个关于“如何做”的页面的每个博客都告诉你,你需要在家里按住屏幕,然后转到“壁纸和样式”并更改您的壁纸。不过,有一个问题。

我记得当 Android 12 处于 Beta 版时,它支持 Material You 颜色。但是(我假设)在正式发布后,此支持已被删除,因为我无法找到该选项。这是我在主屏幕按住时的样子:

图片

它说“壁纸”,当我点击它时,它不会打开一个名为“壁纸和风格”的菜单,它只是重定向到动态壁纸。我在 Android 12 官方版本中找不到壁纸颜色选项。但是,它出现在即将推出的 API 32(我相信是 Android 13)模拟器上。

经过一番研究,我发现系统在系统资源等下生成壁纸颜色,这些资源system_accent1_600从 API 31 开始可用(更多信息here)。当我使用处于测试阶段的 API 32 模拟器时,这确实有效,但它默认为我还没弄清楚从哪里来在 API 31 官方模拟器上。

这是问题:

从 Android 12 (API 31) 开始正式支持Material You 颜色吗?如果是,那为什么我无法在 Android 的官方模拟器上找到它?

此外,是否可以检测设备是否支持具有不同选项的 Material You 颜色?

4

2 回答 2

2

我认为这就是你要找的:

public static boolean isDynamicColorAvailable() 
{
    return VERSION.SDK_INT >= VERSION_CODES.S && DYNAMIC_COLOR_SUPPORTED_MANUFACTURERS.contains(Build.MANUFACTURER.toLowerCase());   
}

在com.google.android.material.color的DynamicColors类中找到了这个

你可以简单地这样称呼它:

boolean isdca = DynamicColors.isDynamicColorAvailable();

我希望这能回答最后一部分。

于 2022-01-05T04:34:11.283 回答
2

1. 从 Android 12 (API 31) 开始正式支持 Material You 颜色吗?

是的!但它基于ROM的实现方式。如果您使用 Pixel,您可以通过内置的壁纸应用程序更改颜色。但是,如果您使用的是 AOSP,那么用户界面中没有正式的方式可以让用户更改它。

查看此文档:https ://gist.github.com/zhaofengli/232f5a3d33113871ad61491629886084

2. 如果是,那为什么我在安卓官方模拟器上找不到呢?

看起来谷歌从镜子中删除了它。以前的镜子有这个功能。

3.另外,是否可以检测设备是否支持Material You颜色?

由于Android 12官方支持Material You,所以你可以简单地查看api版本。但是,根据第二点,有些系统还是不支持,所以可以用这个方法com.google.android.material.color.DynamicColors#isDynamicColorAvailable。这是 Material Design 使用的最终方法,具体取决于 SDK 版本和手机制造商。

https://cs.github.com/material-components/material-components-android/blob/2ae3ca42985722900f53de9d9a1ef61c143767eb/lib/java/com/google/android/material/color/DynamicColors.java#L279-L289

4、Material You的正确实现方式是什么?

  1. XML方式:遵循官方文档:https ://m3.material.io/libraries/mdc-android/color-theming
  2. 以编程方式:

查看我的应用程序代码

val Context.colorOnPrimary: Int
    get() {
        return when {
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && isNight() -> {
                ContextCompat.getColor(this, R.color.material_dynamic_primary20)
            }
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
                ContextCompat.getColor(this, R.color.material_dynamic_primary100)
            }
            isNight() || !supportNight() -> {
                ContextCompat.getColor(this, R.color.md_theme_dark_onPrimary)
            }
            else -> {
                ContextCompat.getColor(this, R.color.md_theme_light_onPrimary)
            }
        }
    }

于 2022-01-06T10:36:20.787 回答