Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【Android】テキスト選択色の問題修正で心がけたこと

 【Android】テキスト選択色の問題修正で心がけたこと

AndroidアプリのAIチャット画面でテキスト選択が見づらかった問題を、Material Design 3のColor Rolesの原則に従って解決した事例を紹介します。

「選択色を変える」という表面的な対処ではなく、「カードの背景色を正しいコンテナーカラーに変える」という根本的な修正を行いました。

デザインシステムの意図を理解した適切な修正の重要性について解説します。

Shibuya.apk #54での発表資料

Avatar for tonionagauzzi

tonionagauzzi

November 07, 2025
Tweet

More Decks by tonionagauzzi

Other Decks in Technology

Transcript

  1. 問題の原因 背景色が primary (青) テキスト選択色: デフォルトの primary (青) AdaptiveRoundedCard( colors

    = CardDefaults.cardColors( containerColor = MaterialTheme.colorScheme.primary // 背景色 ) ) { SelectionContainer { MarkdownText( text = message.text, color = MaterialTheme.colorScheme.onPrimary // テキスト色 ) } } 同じ色のため選択状態が見えない テキスト選択色の問題修正で心がけたこと Shibuya.apk #54 6
  2. 最初の解決アプローチ テキスト選択色を onPrimary に変える val customTextSelectionColors = TextSelectionColors( handleColor =

    MaterialTheme.colorScheme.onPrimary, // テキスト選択つまみの色 backgroundColor = MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.5f), // テキスト選択領域の色 ) CompositionLocalProvider( LocalTextSelectionColors provides customTextSelectionColors ) { // AdaptiveRoundedCard の実装 … } この対応はよくない テキスト選択には primary を使うのが Material Design の一般的なパターン テキスト選択色の問題修正で心がけたこと Shibuya.apk #54 7
  3. 根本的な解決アプローチ Material Design 3のColor Rolesによると、 https://m3.material.io/styles/color/roles カード、シート、ダイアログなどのコンポーネントにはコンテナーカラーを使用 したがって、カードの背景( primary )の方を別の色に変えるべき

    カードの背景には primaryContainer や secondaryContainer を使う テキスト選択色は primary がデフォルトで適切 テキスト選択色の問題修正で心がけたこと Shibuya.apk #54 8
  4. 検討した4つの案 案 背景色 テキスト色 選択色 評価 primary onPrimary primary onPrimary

    最初の解決アプロー チ。問題は解消する が、Material Design 3 の思想に反する secondaryContainer secondaryContainer onSecondaryContainer primary 問題は解消するが、 テキストの読みやす さが低下 primaryContainer primaryContainer onPrimaryContainer primary 問題は解消するが、 選択色の視認性が低 下 surfaceContainerHighest surfaceContainerHighest onSurface primary 問題が解消し、背景 からの距離が近い場 合の色なので最も見 やすい テキスト選択色の問題修正で心がけたこと Shibuya.apk #54 9
  5. 最終的な実装 AdaptiveRoundedCard( colors = CardDefaults.cardColors( containerColor = MaterialTheme.colorScheme.surfaceContainerHighest // カード色にはコンテナカラーを指定

    ) ) { SelectionContainer { MarkdownText( text = message.text, color = MaterialTheme.colorScheme.onSurface // テキスト色にはサーフェスを指定 ) } } テキスト選択色はMaterial Design 3のデフォルト( primary )のまま 当初検討していた TextSelectionColors の設定は不要 テキスト選択色の問題修正で心がけたこと Shibuya.apk #54 11
  6. まとめ 問題: テキスト選択状態が見えない 原因: 背景色と選択色が同じ primary 解決案: Material Design 3のガイドラインに従い、

    surfaceContainerHighest を使用 学び: 「選択色が見えない」という問題なので、つい選択色を直しがちだが、 デザインの原則を確認し、適切な修正をすることが重要 テキスト選択色の問題修正で心がけたこと Shibuya.apk #54 14