【Flutter】文字色と背景色のコントラスト比を維持して自動で変更させる方法
この記事は、Gajeroll Advent Calendar 2022 の2日目の記事です。
この記事では、カスタマイズした背景色に合わせて、文字色を自動で見やすい色に変更させる方法を紹介します。
はじめに
カラフルなボタンをいくつか作っても、それぞれの色に応じて、背景色と同化しないように白や黒を個別に指定するのは面倒です。
今回は、色を自動で指定する方法を紹介します。 Material Design 3 のカラーシステムを使った色の指定方法も紹介します。
色の輝度を調べる
まずは、背景色の輝度(明るさ)を調べて文字色を指定する方法です。
結論
背景色がColor(0xFF00677F)
だとします。
この背景色とのコントラストが大きくなるように文字色を指定するには、Color(0xFF00677F).computeLuminance()
の値が0.5以上か否かで条件分岐すればOKです。
例えば、Text()
の色を指定する場合は、次のようにstyle
を設定しましょう。
Text(
'はっきり見える文字',
style: TextStyle(
color: Color(0xFF00677F).computeLuminance() < 0.5
? Colors.white // 背景が暗いとき
: Colors.black,// 背景が明るいとき
),
),
これでどんな背景色でも、文字をはっきりと表示することができます。
解説
computeLuminance()
を使えば、色の輝度を調べることができます。
computeLuminance()
は、黒なら0
、白なら1
を返します。
よって、中央の0.5
で条件分岐し、0.5
未満なら黒に近い色、0.5
以上なら白に近い色だと判断できます。
Material Design のカラーシステムを使う
結論
Material Design 3 のカラーシステムに合わせた色の指定をしたい場合は、
・背景色の先頭にon
が付いている場合は外す
・背景色の先頭にon
が付いていない場合は先頭にon
を付ける
ようにすればOKです。
例えば背景色がprimary
の場合は、文字色にはon
を付けて、onPrimary
を指定しましょう。
Text(
'はっきり見える文字',
style: TextStyle(
color: Theme.of(context).colorScheme.onPrimary, // onPrimaryを指定
),
),
解説
Material Design 3 のカラーシステムでは、
・primary
とonPrimary
・primaryContainer
とonPrimaryContainer
とのコントラスト比が、それぞれ少なくとも4.5:1
以上になるように設計され
ています。
(ライトモードのprimary
はPrimary40、とonPrimary
はPrimary100が採用されているので、primary
とonPrimary
との間は60ステップあります。よって実際のコントラスト比は、少なくとも5:1
以上はあると思います。)
そのため、on
なしとon
ありの色どうしを組み合わせれば、自然と見えやすい色になるのです。
これらのコントラスト比はprimary
に限らず、secondary
、tertiary
、error
でも同様に4.5:1
以上になります。
さらに、
・background
とonBackground
・surface
とonSurface
・surfaceVariant
とonSurfaceVariant
どうしのコントラストも少なくとも4.5:1
以上であり、はっきりと表示することができます。
最後に
Material Design 3 のカラーシステム(color system)について詳しく知りたい方は、こちらをご覧ください。
Material Design 3 Color System
最後までご覧いただきありがとうございます。 PCロールでは、テクノロジーに関する情報をまとめて発信しています。 また、おすすめのガジェットについて幅広く紹介していく、ガジェロールもあります。 ガジェットやソフトを使うエンジニア・クリエイターはぜひご覧ください。