Material Design 3ガイドライン概要

[Android Advent Calendar 10日目](https://qiita.com/advent-calendar/2021/android)です。
Material Designの一般的な話に留まってしまいました。Android特有の話やコードは出てきませんが、「ふーん」と流し読みいただければ幸いです。


# Material Design 3とは

2014年にGoogleから発表されたMaterial Designですが、2018年にMaterial Themingが登場し、今年2021年にMaterial Youが新たに発表されました。発表当初は「Material You」という呼称での発表でしたが、先日ガイドラインが登場し、そこでは「Material Design 3」、略称として「M3」と記載されていました。このタイミングで、Material ThemingをM2、Material YouをM3と整理されたようです。
下記のガイドラインの用語集の中に詳細が記載されています。

https://m3.material.io/foundations/glossary

なお、Material ThemingおよびMaterial YouはM2/M3それぞれの特徴のひとつであり、厳密には「M3=Material You」ではないようです。が、そこまで気にするところではないかなと思っています。

M1/M2のガイドラインも残っているようですので、記載しておきます。

- [M1ガイドライン : https://material.io/archive/guidelines/](https://material.io/archive/guidelines/)
- [M2ガイドライン : https://material.io/design](https://material.io/design)
- [M3ガイドライン : https://m3.material.io/](https://m3.material.io/)

URLのpathからわかるように、M1はarchive扱いになっていて、M2がmaterial.ioのドメインを使っています。そしてM3は新しいドメインを使っていることから、M3登場のタイミングでM1~M3の採番が行われたことがわかります。

ガイドライン自体はとてもボリューミーなので、ポイントをいくつか絞って説明したいと思います。また、本記事中の画像は基本的には[Material Designガイドライン](https://m3.material.io/)のものを使用しております。

# M3の特徴

## Material You

Google I/Oで大体的に発表されたMaterial Youが、一番大きな特徴でしょう。ユーザの端末の壁紙から色を抽出し、その色をベースにウィジェットやアプリの配色が変わる機能です(Dynamic Color)。ただし、対象端末はPixelと機種が限られている上、対応するためにはデザインもアプリ実装もM3のカラースキームに対応する必要があります。Googleアプリは対応しているようですが、これが浸透するには時間がかかりそうな気がします。
なお、チュートリアルにはデザイナー向けにFigmaのものも用意されていました。

https://codelabs.developers.google.com/visualize-dynamic-color#0

また、Dynamic colorの対象はアプリのViewだけではなく、イラストにも適用させることが推奨されています。[^dynamic-color出典]
[^dynamic-color出典]: dynamic colorの出典：https://m3.material.io/styles/color/dynamic-color/imagery
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/7b979596-e851-106e-316b-2d743eebdf26.png)
ガイドラインでは肌や髪の色は不変とすること(dynamic colorに依存しないこと)、背景を固定色(白など)で塗りつぶさないこと、コントラストを保つためにトーンは出来るだけ40~90にすること、などが説明されています。


## Color Ruleの変更


### Accent colors

M2ではPrimary/Secondaryが定義されていましたが、M3ではTertiary key color(3番目の意味)が追加されました。
これは単純に表現力向上の目的で追加されています。また、この3色をまとめてAccent colorsと呼ばれています。[^color-rule出典]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/3b835ce1-aa51-cf06-d173-fed65027be0b.png)
また、それぞれの色に"On"ColorがあるのはM2と同じですが、"Container"が新たに追加されました。元の色よりも弱めの薄い色が指定されていて、比較的強調度が低い場合に利用します。
[^color-rule出典]: color ruleの画像出典：https://m3.material.io/styles/color/the-color-system/key-colors-tones

一方、M2のPrimary Variant/Secondary Variantはなくなっているようです。M2ではPrimary VariantにはPrimary Colorの濃い色を設定し、status barの背景色などに使っていましたが、M3ではstatus barの背景はAppBarと同じ色になったようです。

|M2|M3|
|:-:|:-:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/01ee9f67-6b67-8942-d19e-17efbb04c7da.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/bf9b87a4-6470-289e-cfb6-6dae710abc7e.png)|
|status barはPrimary Variant|status barはPrimary Color(AppBarと同色)|

### Neutral colors

M2ではBackground/Surfaceとして定義されていた色が、纏めてNeutral key colorとして定義されました。さらに、色味の少し異なるNeutral Variant key colorが追加されています。この2色をNeutral colorsと呼びます。両者とも、主に背景やアウトラインなどに利用する色です。[^color-rule出典]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/b397e6e4-e16e-02ec-c567-d816ea16abec.png)
また、Accent colorsとNeutral colorsの5色をあわせて `Key colors` と呼びます。

### Tonal palettes

さて、Key colorsで紹介した画像に”Primary80"など10から100の数字が入っていたことにお気づきでしょうか？
ひとつのKey colorから4色(Neutral Varian Key Colorのみ3色)が派生していますが、これはKey colorのトーンにより自動的に割り当てられています。[^color-rule出典]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/913aa1f7-b6ff-4046-e090-3bd1bf567a0d.png)
上記のように、ひとつの色をトーンによって13色に分類します。0〜100の数値で表され、0が濃くなり(黒)、100が薄く(白)なります。これを自動で割り振るため、5つのKey colorを決めるだけで派生色は自動的に決まるようになっています。
例えばPrimary Colorの場合は、ベースがトーン40になり、On Primaryがトーン100（白）、Primary Containerが少し薄めのトーン90、On Primary Containerがトーン10（黒っぽいPrimary Color）といった形です。

## Design Tokenの導入

Design Tokenとは、雑にいってしまうとデザインから開発まで一貫して利用できる共通言語のようなものでしょうか。色、マージン、フォント、Shapeなど見た目に関する全ての値(情報)すべてがDesign Tokenとなります。Design Tokenの概念自体は2014年頃に登場したものなので、調べると多くの解説記事が見つかると思います。

https://blog.adobe.com/jp/publish/2021/03/29/cc-web-what-are-design-tokens#gs.i0xj9t

Material Designでは以下3つのTokenが定義されています。

- Reference token
    - 生の値のエイリアス
- System token
    - Reference tokenを参照
    - 役割を示す
    - light/dark themeによる参照先の切り替えは、このTokenの役目
- Component token
    - System token(またはReference token)を参照
    - UIパーツの各部分を示す
        - 例）ボタンの背景色、テキストのサイズ
    - 現在Googleにて開発中


![MaterialDesignにおけるDesignToken](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/0a600032-c72b-9c99-917f-ff1b6e98026c.png)

M3における各UIパーツのSpecは、このDesign Tokenを使って、細かく値が定義・管理されています。
FigmaやVSCodeでは、Pluginを使うことでツール間でDesign Tokenの設定を取り込むことができるようです。

## その他の特徴

他にTypographyの再編がありました。また、Foldable端末やLarge Screen、デスクトップなどの言及がされています。Foldable端末の場合、ヒンジ部が考慮されたガイドラインが少ないながら記載されています。詳細は割愛しますが、Foldable端末の普及状況次第ではこちらのガイドラインも追加されるかもしれないですね。


# UIパーツの変更

## 全体的な変更

ぱっと眺めるとわかるように、丸くなった印象を受けます。また、画面サイズが大きくなったためか、デフォルトのサイズもやや大きくなりました。
さらにガイドラインを細かく読むと、Shadowがデフォルト無しになっているパーツが増え、色味でパーツ間の区別をさせるようになっています。次に紹介するSurface Tonesが、その役割を担います。

### Surface Tones

M3ではオブジェクトの表層に半透過のレイヤーが重ねられており、Elevationに応じてこのレイヤーの透過度が変わります。色はPrimary Colorが使われます。下表は[ガイドライン](https://m3.material.io/styles/color/the-color-system/color-roles)に示された例です。

||+1|+2|+3|+4|+5|
|---|---|---|---|---|---|
|見た目|![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/b757dea0-0efc-5d49-090c-56142a4c561f.png)|![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/abaa9144-6aad-5db9-5b6a-6cca9f98c523.png)|![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/8311da13-695a-3a2c-94fd-d2d418671b9c.png)|![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/75d719fb-b288-87c6-46ce-c4db2fea9362.png)|なし|
|透過度|5%|8%|11%|12%|14%|

※Elevationは0~+5の6段階が定義されていますが、Androidのdpでの数値は明記されていません。[^elevation]
[^elevation]: [DesignToken](https://m3.material.io/foundations/design-tokens/overview)の章に `tokens for components, elevation, and size measurements are in development` と記載があり、2021年12月現在開発中とのことです。

実はM2でも[Elevation Overlay](https://material.io/design/color/dark-theme.html#properties)として、Elevationに応じてレイヤーの色を変えるというガイドラインはありましたが、Shadowの見えづらいDark Themeのためのガイドラインでした。
M3では、Light Theme、Dark Theme共にこれが採用されることで、Shadow以外でのコンテンツ間の境界がわかりやすくなります。また、アクセシビリティ観点でも、コントラストがつくことで改善されます。


#### State Layer

なお、Surface Tonesとは別にState Layerと呼ばれる半透過のレイヤーも存在します。ここでも同じくPrimary Colorが使われます。
Hover/Focus/Press/DragおよびSelected/Activated、Disabledそれぞれの状態によって透過度が変化します。

https://m3.material.io/foundations/interaction-states


## UIパーツごとの変更点

ここからは標準UIパーツのガイドラインを少しずつ紹介します。

### FAB

![FAB](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/6d089b4d-b2b8-1bdb-05c1-d6a8960d9bbc.png)

- Large(96dp)が追加
    - M2ではDefault(56dp)とMini(40dp)の２つだけだった
    - Defaultのサイズは変更なし
    - Miniは、M3でSmallに呼称が変更（サイズは変更なし）
- 円形から角丸に変更
    - 賛否両論ありそう。個人的にはまだ違和感…
- 配色が一新され、背景色がPrimary ColorからPrimary Containerに変更
    - 他にもSurface、Secondary Container、Tertiaryを用いたカラーマッピングも提供されている
- Extended Fabの高さとElevationが、Fabと同じになった
    - M2では差分があったので、M3で違和感が解消された

### ボタン

- 角丸から半円に変更
    - 基本的には角丸にしない。角丸はFABとChipで利用。
    - 高さも36dpから40dpに変更
- Elevated、Filled、Filled Tonalが追加[^ボタンの出典]
    - M2で定義されていたContainedが、Elevated/Filled/Filled Tonalに細分化されています

||M2|M3|
|---|:-:|:-:|
|Contained|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/85c18d60-4db2-f96a-46b4-c88313d6b8fc.png)|Elevated/Filled/Filled Tonalに細分化された|
|Filled|なし|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/1f94c1d0-bd4e-a41d-cba5-993873752e5a.png)|
|Filled　Tonal|なし|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/1488d25f-e93e-dda1-ca68-e0911353a8c5.png)|
|Elevated|なし|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/713f6b7a-63e5-dd8d-16c1-8318a6877647.png)|
|Outlined|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/30b886b4-7f1f-2e3e-d7e8-6f6ff1381b25.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/e672feff-a818-f2c3-0566-0773a24bea8d.png)|
|Text|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/8ac337ea-4ac9-067e-0c3c-06d4c91ecf99.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/d629478c-6f45-977c-e2ee-0070dd01928d.png)|

重要度に応じてボタンを使い分けます。基本的には表の上の方が強調したいときに使用します。

[^ボタンの出典]: ボタン画像の出典：https://m3.material.io/components/buttons/overview


### Chip

- 半円から、角丸に変更
    - 半円はボタンに使われています
        - ボタンは静的で事前にアクションが決まっている
        - Chipは要素が動的で、サポート的な役割を持つ
- 種類も整理されている
- 影はデフォルトなし（elevationもゼロ）
    - 画像の上に配置する場合など、Chipが背景に同化させないために影を使うことはOK



||M2|M3|
|---|:-:|:-:|
|Input|![m2_input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/1569887d-78da-e79e-d646-24864f853950.png)|![m3_input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/7c89b70f-d115-b5ef-a7d5-405287ba60c9.png)|
|Choice|![m2_choice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/264c1a83-1114-1959-dfaf-d1899d413503.png)|Filterのサブセットとなる|
|Filter|![m2_filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/174471ce-bdec-972e-22b0-b06f513993b1.png)|![m3_filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/88236969-ddc2-09c7-4ff9-7da0d551b2e2.png)|
|Action|![m2_action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/7bdaa4e2-8b74-5dc2-6a8b-623c262eadef.png)|AssistとSuggestionに細分化|
|Assist|なし|![m3_assist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/7fed2e8a-aa8b-a5cb-beaa-9bf9543623db.png)|
|Suggestion|なし|![m3_suggestion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/56fa7b4d-929b-fe1c-e85d-60d15d4683a2.png)|


※画像は[M3ガイドライン](https://m3.material.io/components/chips/overview)をベースに持ってきましたが、M2のデザインがガイドラインに沿っていなかったため、[M2](https://material.io/components/chips#action-chips)のガイドラインから持ってきました。


### Navigation bar

- M2ではBottom navigationと呼ばれていたが、呼称が変更された
- Drop shadowが無くなった
    - ただしElevationはLevel2で、Surface ToneによりPrimary Color透過度8%の背景色になる
- active状態の表示が変更
- 高さが少し高くなった


||M2(Bottom　Navigation)|M3(Navigation　Bar)|
|---|:-:|:-:|
||![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/612cb053-299a-7dd2-be39-f9c1dcaffe3f.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/0821add7-69fd-4325-8dee-32f5d3a12f26.png)|
|inactive状態|opacityで色を薄く表現|アイコンはoutline|
|active状態|透過なし|アイコンはfilledで、アイコン部分にIndicatorを表示|
|shadow|あり|なし|


### Top app bar

- ドロップシャドウなし(Elevation0)
- スクロールするとElevation2へと変化する
    - Surface ToneによりPrimary Color透過度8%の背景色になり、コンテンツとの境界がわかりやすくなる
- 高さが高くなった
- 4タイプが定義

|M3での呼称|M2|M3|
|---|:-:|:-:|
|Cener-aligned|なし|![m3_center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/ddd0771e-f7db-28f1-c4f4-b4411ef50a10.png)height = 64dp|
|Small|![m2_appbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/ebfe4511-b099-ea5f-3ca9-0ab6f5f1dfc5.png)height = 56dp|![m3_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/f32ddb4d-c4f4-8c3d-ae2f-82e34bd0c963.png)height = 64dp|
|Medium||![m3_medium.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/c225cf9d-3dcb-7833-0335-e8241aa2d277.png)height = 112dp|
|Large|![m2_large.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/ce10da96-fff1-055d-7e61-a9cf56edc43f.png)height = 128dp|![m3_large.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/c1362274-a865-1dd1-f5cc-d228a6978f5e.png)height = 152dp|

M2のデフォルトは、M3だとSmall相当になります。また、M2のExtended top app barのSpecは128dpとして紹介されていましたので、M3だとMediumとLargeの中間くらいに相当しそうです。

また、今年のAdventCalendar6日目で実装に関する詳しい記事が投稿されていましたので、紹介いたします。スクロール時に背景の色が変わる様子はガイドラインでは見れませんが、こちらの記事では動画で紹介されているため、イメージしやすいと思います。

https://qiita.com/Nabe1216/items/0823dc7ebfb5d616f9c1

### その他のUIパーツ

- Card
    - elevated、Filled、Outlinedの3タイプが定義
    - デフォルトでは影なし
        - elevationはLevel1だが、影なしがデフォルト
- Navigation Drawer
    - Indicateの形が半円になった
    - `Standard navigation drawer`と`Modal navigation drawer`が定義
        - 今まで広く認識されていたのはModalの方
        - Standardは、タブレットなど大画面端末で常に表示されているメニューのこと
- ダイアログ
    - 角丸のradiusが増え、丸みが増した




# 所感

M3については、dynamic colorに対応しているのがPixelのみなど、できることが限られていることもあり、対応しているアプリはとても少ないと思います。また、見た目も大きく変わるため、ブランドイメージなどを考えるとそのまま導入するのは難しく、浸透には時間がかかると思います。工数観点でも、簡単な対応ではないので、M3が実際に浸透するかどうかも不透明だと感じています。

ただ、M3の思想・ガイドラインを理解し、一部だけでもM3を取り込むことでより良いサービスにブラッシュアップできる可能性はあると思います。この記事がそのお手伝いになれば幸いです。

## おまけ

先日、2021/11/29-30に開催された[FlutterKaigi](https://flutterkaigi.jp/#/) でもMaterial Youについての発表がありました。セッションの前半はMaterial Design全般に関する話ですので、こちらもご参考にどうぞ。
（私も運営スタッフとしてMCなどを担当させていただきました）

https://youtu.be/_iX6AwZyaQc