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

運用中アプリに ダークテーマを適用してみる

AsamiShimizu
February 20, 2020

運用中アプリに ダークテーマを適用してみる

DroidKaigi2020で登壇発表予定だったものです。

- ダークテーマ概要
- 強制ダークを試してみる
- MaterialComponents化
- 地道にやっていき
- WebViewのDarkThemeについて
等です。

AsamiShimizu

February 20, 2020
Tweet

More Decks by AsamiShimizu

Other Decks in Programming

Transcript

  1. 自己紹介
 • 名前
 ◦ Shimizu Asami(@starmAIne777)
 ▪ アイコンはかわいいうちの猫です
 • 所属


    ◦ Diverse Inc. 
 • やってること
 ◦ YYCのAndroidエンジニア / Diverseボードゲーム部部長
 
 

  2. 今日お話すること
 • ダークテーマとは
 • 対象アプリの紹介
 • 自分のアプリをダークテーマ対応するには
 • 強制ダークを試してみる
 •

    MaterialDesignComponentsを導入しよう
 • Componentsを微調整しよう
 • 地道にやっていき
 • WebViewについて

  3. YYCはどんなアプリか
 • 運営実績19年!Androidアプリも2012/10からあります!
 ◦ Androidアプリに関しては2016/3に大リニューアルしました 
 • 「SNS感覚で出会えるアプリ」なので、つぶやき、掲示板、日記等、
 いろいろな機能があります
 ◦

    リスト的な表示の画面が多い 
 • PCブラウザから始まり、現在ではスマホブラウザ(lite)、Androidアプリ、iOSアプリが あります
 • 新機能はスマホブラウザ先行型。画面のWebView率高め。

  4. 強制ダークを使ってみよう
 styles.xmlのアプリのテーマに一行足すだけ。
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Theme Colors --> <item

    name="colorPrimary">@color/theme_primary</item> <item name="colorPrimaryDark">@color/theme_primary_dark</item> <item name="colorAccent">@color/theme_accent</item> </style> <item name="android:forceDarkAllowed">true</item> めっちゃ簡単!!

  5. MaterialDesignComponents AndroidLibrary
 https://github.com/material-components/material-components-android 
 • MaterialDesignComponentsのLibraryのGithubには以下のものが入っているので一 度Cloneすると便利かもしれない
 ◦ MaterialDesignConponentsLibrary本体 


    ◦ MaterialDesignのカタログアプリ 
 ◦ 「Themeの各属性の色を変えたらComponentsがどのように変化するか」がわかるThemeBuilderア プリ(めっちゃ便利)
 

  6. MaterialDesignComponents AndroidLibrary ThemeCatalog
 <color name="color_primary">#6200ee</color> <color name="color_primary_variant">#3700b3</color> <color name="color_secondary">#03dac6</color> <color

    name="color_secondary_variant">#018786</color> <!--colorBackground appears behind scrollable content and is used for the default window--> <!--background. colorSurface is mapped to the surface of components such as cards, sheets--> <!--and menus. colorError is used to indicate an error state for components such as--> <!--text fields.--> <color name="color_background">#ffffff</color> <color name="color_surface">#ffffff</color> <color name="color_error">#b00020</color> <!--"On" colors define how text, icons and strokes are colored in relation to the surface--> <!--on which they appear.--> <color name="color_on_primary">#ffffff</color> <color name="color_on_secondary">#000000</color> <color name="color_on_background">#000000</color> <color name="color_on_surface">#000000</color> <color name="color_on_error">#ffffff</color> material-components-android/material-theme-builder/src/main/res/values/themes.xml 
 material-components-android/material-theme-builder/src/main/res/values/color.xml 
 material-components-android/material-theme-builder/src/main/res/values-night/color.xml 

  7. MaterialDesignComponents.DayNightに変えた直後の感想
 • ダークモードにしても全然かわってない……
 ◦ このタイミングでちゃんと作ってあるアプリだとだいぶDarkThemeっぽくなってるはずだけども、弊ア プリはそうではなかった 
 ◦ 後述するが、各背景に @color/whiteが直接的に設定されていた

    
 ◦ 最近作成されて、特に背景色が設定されてなかったCardViewだけはDefaultの背景色が設定されて 黒くなっていた
 • ちょこちょこ見た目が変わったコンポーネントがある
 ◦ 前述の通り、Themeを設定すると各ComponentsがMaterialComponentsの見た目になるため。次章 で一つずつ修正していきます。 

  8. TextInputLayout
 DefaultStyleは Widget.MaterialComponents.TextInputLayout.FilledBox Material Design guidelines: Text Fields 
 Material

    Components for Android: TextFields 
 1. Container
 2. Leading icon (optional)
 3. Label text
 4. Input text
 5. Trailing icon (optional)
 6. Activation indicator
 7. Helper text (optional)

  9. Button(Material Button)
 • 角を丸くしたい!
 ◦ app:cornerRadius で角の大きさを指定できます。↓のように丸いボタンにしたい場合はheight の半分の高さを指定してあげればOK 
 •

    背景色をつけたい!
 ◦ AppTheme版だとbackgroundで画像を設定していたが、 app:backgroundTint で色を設定
 AppTheme
 MaterialComponents 

  10. Button(Material Button) layout_heightを指定するときの注意
 • MaterialButtonはシャドウ設定のために、layout_heightよりも小さく表示される よう、insetが設定されています。
 旧テーマ
 inset未設定
 (色も未設定)
 ex) layout_height=16dpのボタン


    app:insetTop=”0dp” app:insetBottom=”0dp” • もしlayout_heightの全幅でボタンを表示したい場合は↓を設定
 ◦ app:insetTop=0dp ◦ app:insetBottom=0dp • その場合ちゃんとシャドウが表示されるかどうかを確認しておくこと!
  11. styles.xmlはこうなった(MaterialButton編)
 <style name="BaseTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="buttonStyle">@style/YycButton</item> </style> <style name="YycButton" parent="Widget.MaterialComponents.Button">

    <item name="android:textSize">@dimen/text_button</item> <item name="android:textColor">@color/white</item> <item name="android:textStyle">bold</item> <item name="cornerRadius">@dimen/shape_rounded_btn_radius</item> <item name="android:minHeight">@dimen/view_height_large</item> </style> <style name="YycMiniButton" parent="Widget.MaterialComponents.Button"> <item name="android:textColor">@color/white</item> <item name="cornerRadius">@dimen/view_my_page_option_btn_radius</item> <item name="android:textSize">@dimen/text_ssmall</item> <item name="android:insetTop">0dp</item> <item name="android:insetBottom">0dp</item> <item name="android:padding">0dp</item> <item name="android:gravity">center</item> <item name="android:minHeight">@dimen/view_my_page_option_btn_height</item> </style>
  12. まとめ
 • Androidのダークテーマ対応方法は2パターンあります
 ◦ 強制ダーク
 ◦ ThemeをDayNightに変更 
 • DayNight対応するならMaterialComponentのThemeのほうが全体的に対応してくれ

    て楽
 • 色のハードコーディングはやめる、自分アプリへの色の設定も、できればThemeの 属性を使うと全体的な均衡がとれて良い
 • LightとDarkでresourceを変更したい場合は代替リソースを用意
 • DayNightテーマでWebView使いたいときはmediaQueryで (prefers-color-scheme: dark)を設定forceDarkをONにする

  13. やりたかったけどできなかったこと
 • そもそものStyleの整理
 ◦ 多分コンポーネントの棚卸ししてパターンを整理す べきだったんだろうな…… 
 ◦ Styleの全体の見直しタイミングとしては最適だけ どもあまりにもでかすぎる修正になる リニューア

    ル並
 ◦ Textとかもこれにそれぞれ当てはめていきたかっ たな
 • この発表までにダークテーマ用アプリをリ リースすること
 ◦ 特にWebViewのあたりは足並みを揃える必要が あったのでできなかった