概要
どうも、@daiki1003です!
Flutter 3.22
がリリースされて、はや数ヶ月。
今回は、そんなFlutter 3.22
でひっそりと(?)アップデートされた ColorScheme
について、
特に Material 3
との関係性に着目して解説していきたいと思います。
・「ColorScheme
って何だっけ?」
・「Material 3
のカラーシステムって複雑でよくわからない…」
そんな風に思っている方はぜひ最後まで読んでみてください。
当たり前ですがFlutter
はMaterial
テーマに最適な形でコーディングされています。
理解することで、きっとFlutter
アプリのカラーデザインがもっと楽しく、そして楽になるはずです!
それでは、行ってみましょー!
全体感
基本理念
そもそも、なぜデザインシステムが必要なのでしょうか。
適当に決めてしまえば良いのでは?
そんな風に思う方も中にはいらっしゃるのではないでしょうか。
そこまでは思わずとも、なぜこんなものが必要なのでしょうか。
僕が考える一番の理由は、 「ユーザーが使いやすいアプリを、いかに効率良く作るか」に尽きると思います。
使いやすい、と言う言葉はUX観点の言葉ですが多くの意味を含んでいます。
例えば、あいうえお こんなのって明らかに見にくいじゃないですか。
じゃぁ、そうならないように気をつけながら全てのコンポーネントを個別スタイリングしますか?
めんどくさすぎますね。そして保守性も良くない。
そこで登場するのがデザインシステムです。
そして、Flutter
でその中枢を担うのが ColorScheme
クラスです。
個人的には、このクラスの役割は iOS
で言うところの delegate
に似ていると思っています。
「 ElevatedButton
は primary
と言う色を塗り、その上に載せるコンポーネントは onPrimary
と言う色で着色する様に実装しておきますね。あとはこれらの色を指定してください。」とこう言うわけです。
4.5:1
4.5対1。
何の数字かわかりますか?
わかる方はこのセクションは飛ばしてしまってOKです。
これは、「背景色と上に載せる色のコントラスト比がこの数値以上であれば視認性が良いですよ」と言う値になります。
4.5:1を大きく下回りとても視認性が悪いと言うことになります。
次に、あいうえおは以下の様な比率になります。
こちらは高スコアですね。
計算はこちらのサイトで行っております。
実際に指定する際は、この比率を守る様にしてくださいね。
参考:Accessibility designing – Material Design 3
それでは、本題にいきましょー!
最重要人物
Primary, Secondary, Tertiary
アプリを特徴付ける色合いに用いられます。
それぞれは異なった色合いを持ち、 おおよそ以下の様な役割があります。
Primary: アプリのメインカラー。ブランドイメージを表現し、最も頻繁に使用する色。
Secondary: Primary
を補完するアクセントカラー。Primary
とのコントラストで視覚的なメリハリをつける。
Tertiary: Primary
やSecondary
とは異なるニュアンスを持つカラー。UI要素のバリエーションを増やしたり、特定の要素を強調したりする際に使用する。
Error
Error
カラーは、ユーザーにエラー状態を明確に伝えるための色です。
例えば、入力フォームでエラーが発生した場合、Error
カラーを使用してエラーメッセージの背景色やテキストの色を変更することで、ユーザーはエラーに気づきやすくなります。また、エラーを示すアイコンの色をErrorカラーにすることで、視覚的な注意を促すことができます。
Surface
Surface
カラーは、マテリアルデザインにおけるUIの「面」となる要素の背景色として使用されます。
例えば、カードやシート、ダイアログなどの背景色は、 Surface
をベースに決定されます。
また、 AppBar
の背景色もSurface
カラーを使用することで、UI全体に統一感を持たせることができます。
Outline
Outline
カラーは、ボタンの枠線やテキストフィールドの輪郭の様な、要素の輪郭を表現するための色です。
その名の通り、OutlinedButton
や TextField
などの外枠を表示するために使います。
装飾
装飾系の言葉は、これ単体では存在せず、必ず上記の様な登場人物の接尾辞として登場します。
Container
新登場?: Yes
例: primaryContainer
, surfaceContainer
…
Container
カラーは、塗りの色に使われます。
付属している色に対して、塗りのコンポーネント(ElevatedButton
など)を乗せる時に利用します。
テキストやアイコンに使ってはいけません。
Lowest, Low, High, Highest
新登場?: Yes
例: surfaceContainerLowest
, surfaceContainerLow
, surfaceContainer
, surfaceContainerHigh
, surfaceContainerHighest
surfaceContainer
だけ派生系があります。
多くの場合、Lowest
は背景色に近く、 Highest
は反対色になります。
背景色に近い = コントラスト比が低い = Low
です。
on
新登場?: No
例: onPrimary
, onSurface
, onErrorContainer
…
何らかの色の接頭辞として付きます。
そして、その色に載せるコンポーネントを表示するために適切な色を提供します。
例えば、 onPrimary
は Primary
の上に載せるコンポーネントの色です。
Fixed
新登場?: Yes
例: primaryFixed
, secondaryFixed
…
light
モードにおいて、 Fixed
よりより強調された色調を提供します。
light/dark
どちらも変わらず同じ色な所も注意です。
Bright/Fixed
新登場?: Yes
例: surfaceDim
, surfaceBright
surface
のみ、この対応関係が存在します。
light
モードでは、 surface/surfaceBright
は同色を提供し、dark
モードでは surface/surfaceDim
は同色を提供します。
例えば、 surface
を使うと dark
モードで配色が暗すぎる場合に surfaceBright
を使って落ち着かせたりすると言った事が可能になります。
Dim
新登場?: Yes
例: primaryFixedDim
, secondaryFixedDim
, tertiearyFiedDim
Variant
新登場?: No
例: outlineVariant
, onSurfaceVariant
Variant
の名の通り、基本となる色 ( outline
など)と同様の箇所に利用するが、少しだけ色調を変更したい時に利用します。
例えば、有効な状態の外枠は outline
で定義し、無効状態のときは outlineVariatnt
で定義する、と言った事が可能になります。
参考
https://m3.material.io/styles/color/roles
最後に
いかがでしたか?
一度で覚える必要はないとは思いますが、割と単語の意味を考えたりすると分かりやすかったかもしれませんね。
誰かのお役に立てば。Twitterフォローお願いします
「次回以降も記事を読んでみたい!」
「この辺分からなかったから質問したい!」
そんな時は、是非Twitter (@daiki1003)やInstagram (@ashdik_flutter)のフォローお願いします♪Twitterコミュニティ参加お願いします
Twitterコミュニティ「Flutter lovers」を開設しました!
参加お待ちしております😁☕️ Buy me a coffee
また、記事がとても役に立ったと思う人は
コーヒーを奢っていただけると非常に嬉しいです!
コメント