sukawasatoru.com

Material You の色を調べた

Unveiling Material You - Material Design
material-components-android/Color.md at master · material-components/material-components-android

いつもの Material component を使って DynamicColors.applyToActivitiesIfAvailable(this); すれば壁紙またはユーザーが指定した色と連動する値が適用されそうです。

使い方としては以上なのですが Google 製の App ではどういった色の選び方をしているか気になったので調べてみました。

色は colors.xml に定義されており命名に規則がありました。簡単な Compose の実装でリストとして表示してみました:

@Composable
fun ListColorCompose(rootPadding: InsetsPaddingValues?) {
    val context = LocalContext.current

    val items = remember(context) {
        listOf(
            "system_accent1_",
            "system_accent2_",
            "system_accent3_",
            "system_neutral1_",
            "system_neutral2_"
        ).flatMap { prefix ->
            listOf("0", "10", "50", "100", "200", "300", "400", "500", "600", "700", "800", "900", "1000")
                .map { suffix ->
                    val name = "$prefix$suffix"
                    val resId = context.resources.getIdentifier(name, "color", "android")
                    if (resId == Resources.ID_NULL) {
                        log.info("ListColorCompose $name == null")
                        return@map "Not Found ($name)" to Color.White
                    }
                    name to Color(context.getColor(resId))
                }
        }
    }

    LazyColumn(
        contentPadding = rootPadding ?: PaddingValues(0.dp),
        verticalArrangement = Arrangement.spacedBy(8.dp),
    ) {
        items(
            items = items,
            key = { it.first },
        ) { (name, color) -> ColorItem(name = name, color = color) }
    }
}

@Composable
private fun ColorItem(name: String, color: Color) {
    Surface(color = Color.White) {
        Column {
            Text(text = name)
            Divider(Modifier.fillMaxWidth())
            Surface(
                modifier = Modifier
                    .fillMaxWidth()
                    .height(40.dp),
                color = color,
                content = {},
            )
        }
    }
}

こちらの実装は App として動かすか Deploy Preview により確認できます。

どうやら壁紙やユーザーによる可変な system-accent固定な system-neutral があるようです。 system-accent は Dark theme を有効・無効と切り替えても変わりませんでした。
追記 (211023): system-neutral も可変でした

Google 製 App のスクリーンキャプチャーを撮って部品ごとにどの色が使われているのか確認してみました。

GMail:

ComponentLightDark
backgroundsystem_neutral1_10system_neutral1_900
search bar??
floating buttonsystem_accent2_100system_accent2_700
drawer background??
drawer (selected)system_accent2_100system_accent2_700

Settings:

ComponentLightDark
backgroundsystem_neutral1_50system_neutral1_900
buttonsystem_accent1_200system_accent1_200
search barwhitesystem_accent2_700
button group?system_neutral1_800
button (selected)system_accent1_100system_accent1_100
graph bar (selected)system_accent1_600system_accent1_100
graph bar??

Message:

ComponentLightDark
backgroundsystem_neutral1_10system_neutral1_900
floating buttonsystem_accent1_100system_accent1_700
search bar??
main artsystem_accent1_600system_accent1_200

GBoard:

ComponentLightDark
backgroundsystem_neutral1_50system_neutral1_900
keywhitesystem_neutral1_800
actionsystem_accent1_200system_accent1_100
operation keysystem_accent2_100system_neutral1_700
keyboard type keysystem_accent2_200system_accent2_300

Phone:

ComponentLightDark
backgroundsystem_neutral1_10system_neutral1_900
search bar??
main artsystem_accent1_600system_accent1_200
floating buttonsystem_accent1_600system_accent1_200
navigation botton? (search bar と同じ)? (search bar と同じ)
navigation button (selected)system_accent2_100d:system_accent2_700
dialpad textsystem_accent1_600d:system_accent1_200
dialpad backgroun?(near system_accent1_50..100)?
call(app original green)(app original green)

Calculator:

ComponentLightDark
backgroundsystem_neutral1_10system_neutral1_900
ac buttonsystem_accent3_100system_accent3_100
operator buttonsystem_accent2_100system_accent2_300
equal buttonsystem_accent1_100system_accent1_100

Calendar:

ComponentLightDark
backgroundsystem_accent1_10system_neutral1_900
floating buttonsystem_accent2_100system_accent2_700
floating button (selected)system_accent1_600system_accent1_200
save buttonsystem_accent1_600system_accent1_200
selected daysystem_accent1_600system_accent1_200
iconsystem_neutral2_700system_neutral2_200
drawer selectedsystem_accent2_100system_accent2_700

Tips:

ComponentLightDark
backgroundsystem_neutral1_50system_neutral1_900
buttonwhitesystem_neutral1_800
icon on buttonsystem_accent1_100system_accent1_100

一部 Material You っぽい色が使われているようだけれどどの定義とも一致しない色がありました。

所感としては

といったものがあり、これってほぼ Material 3 のデフォルトですね。色の選び方は Applying color to UI - Material Design を押さえておけば特に問題なさそうですね。


timestamp
2021-10-23 (First edition)
2022-07-23 (Last modify)