[Android] Material Design (Color編) 自分用メモ 

Material Design 3というものができたそうですね。開発中にデザインの実装方法などググることはあっても体系的に学んだことはなかったので、復習も兼ねて、Material Design２から学びます。

## 歴史
2014年 Material Design
2018年 Material Theming
2021年 Material You
2021年にMaterial YouがMaterial Design3と呼ぶようになり、それに伴ってMaterial ThemingがMaterail Design2ということになったそうです。（[参照](https://qiita.com/mkosuke/items/314242951766e413b4ab)）

## Material Color
[こちらの公式](https://material.io/design/color/the-color-system.html#color-theme-creation)でいろいろ定義されているのでまとめます。
図案の公式のサイトを見ながらだとわかりやすいです。

名称|概要
---|---
Primary Color|アプリの主要カラー。ツールバーやフローティングボタンなどに使われる。
Secondary Color|アプリの副次的なカラー。Primary Colorだけだと寂しいときに、アクセントとして入れるようです。フローティングボタンなどに。
Variant|変異体の意味。Primary Variantや、Secondary Variantのように使用。色に変化を持たせるために、明度だけを変えてバリエーションをもたせます。Primary Variantなら、Primary Colorより薄い色を使うとかです。
Surface Color|コンポーネントの表面色を表す。カードやシート、メニューなど。
Background Color|背景色
Error Color|エラー時の色
"On" Color|typograpyに使う色。例えば、onPrimaryとか、onSurfaceなどの用に使う。PrimaryColorを背景とした文字の色の定義。例えば、紫のPrimary Colorの場合、ツールバーが紫になります。このときタイトルなどの文字の色をどうするかというときに、OnPrimaryで定義します。白とか黒になります。
Alternative Color|Primary Colorがいくつもある場合、２つ目以降を指すようです。公式のowlというアプリが参考になるでしょう。
Additional Color|コンポーネントごとに別の色を使うなど。公式のRallyというサンプルが参考になります。
Material Pallet Generator|適切な色を導いてくれるツールです。PrimaryColorを設定したとき、onSurfaceは白か黒にすべきか、自動的に出してくれたりします。


## Composeでの実装について
[公式のowlの実装例](https://github.com/android/compose-samples/tree/main/Owl)を見るとこんな感じ。
```kotlin

private val PinkThemeLight = lightColors(
    primary = pink500,
    secondary = pink500,
    primaryVariant = pink600,
    onPrimary = Color.Black,
    onSecondary = Color.Black
)

private val PinkThemeDark = darkColors(
    primary = pink200,
    secondary = pink200,
    surface = pinkDarkPrimary
)

@Composable
fun PinkTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit
) {
    val colors = if (darkTheme) {
        PinkThemeDark
    } else {
        PinkThemeLight
    }
    OwlTheme(darkTheme, colors, content)
}
```

isSystemInDarkTheme()でダークモードかライトモードかを判別し、別に定義したlightColorsやDarkColorsを切り替えます。ComposeにはlightColorsやDarkColorsというオブジェクトが用意されているので便利です(androidx.compose.material)。定義は以下のようになってます。


```kotlin
lightColors(
    primary: Color,
    primaryVariant: Color,
    secondary: Color,
    secondaryVariant: Color,
    background: Color,
    surface: Color,
    error: Color,
    onPrimary: Color,
    onSecondary: Color,
    onBackground: Color,
    onSurface: Color,
    onError: Color
)
```

基本これだけでよいですが、owlの例だともっと発展的なテーマが書かれているので、公式のコードを見てください。


## [Material Design 3](https://camo.qiitausercontent.com/fffbe7967a21c567334b2c11f5b824332ace1df1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3230323533332f33623833356365312d616135312d636630362d643137332d6665643635303237626530622e706e67)
新しいPixelをお使いの人なら分かるかもしれないですがAndroid12だと、壁紙の色を自動検出してテーマの色が変わります。通知領域などの色が変わります。こんな感じ。

![ad](https://lh3.googleusercontent.com/SSsW0i9lTfTbkzwP41Gk0e6eCWwj1JYo--YUv2tWJjbqIzvyf8B4V541MMyCp0ygJXU1CwIwmeYbzSfwvejkT5_D2bX0zHikcik=w0)

自分はPixel6を使ってますが、気分を入れ替えるときにいいですね。~~とはいっても、最初は楽しいですが、壁紙なんてなかなか変えないのが正直なところ~~Tonal palettes

googleアプリにはこのカラーリングが実装されていくようですが、公式以外でも使えます。とはいえ普及のペースは遅いようです。ライブラリも準備されていくようなので、こういうことができるということは頭に入れておいたほうが良いと思われます。


## 色定義の変化
Material Design3は上記2の定義に変更が加わってます。
[参考文献様](https://qiita.com/mkosuke/items/314242951766e413b4ab#fn2)
項目|説明
-|-
Tertiary Color追加|Primary, Secondaryに次いでTertiary Colorが追加になり、よりカラフルになります。Secondaryは目立たない色、Tertiaryはアクセントとして用いられます。
Variant→Container|VariantがなくなりContainerとなりました。Containerは主要の色に比べて薄めです。
Neutral key color|background, surfaceをひっくるめてこういうようになったようです。Neutral Variantも設定されました。
５つのkey color|Primary, Secondary, Tertiary, Neutral, NeutralVariantを5つのkey colorとしています。
Tonal palettes|カラーは0〜100の間の明度で13分割された数値を持ち、Primary90のように表します。5つのkey colorを設定すると、onPrimaryとかContainerとかは、自動的に明度を判断して決めてくれるようです。
Design Token|#E8DEF8などに名前を与えて管理しやすくするようです。保守性が高まるとのことですが、あまり理解できていません。

![Material Design 3](https://lh3.googleusercontent.com/1VEzJeGNEMYFspRMrdyVNxE0DNaAdSKdmKq677OqhjAvN3BSULi4rdIDf87d6cAWlBfsb9i3KjV193jUN8AkSu6f1lp2I8UpwU3BC8VZjEWY=s0)

![Neutral key color](https://lh3.googleusercontent.com/G-HrJanqG6KzhvXs79geulvVQlLSVdbQrVR1ign2qgYuVj-eLLhFe2Yvq5azX0xllcc55BTQD21Qny8o2QUv0jFOluBm9xuH80me1hCXpSA=s0)

だいたい概要としては以上ですが、まだすべておいきれていません。もっと知りたい方は[公式](https://m3.material.io/)か[参考文献](https://qiita.com/mkosuke/items/314242951766e413b4ab#design-token%E3%81%AE%E5%B0%8E%E5%85%A5)が役立つと思います。