SlideShare a Scribd company logo
1 of 34
Download to read offline
Android Q対応
Gestural Navigation
Dark Theme
GDG Kyoto 2019/05/17 @furusin_oriver
Android Q で対応が必要なこと
● Gestural Navigation
● Dark Theme
● SYSTEM_ALERT_WINDOW deprecated
● android.preference deprecated
● バックグラウンドでロケーションが必要な場合、追加のPermissionが必要
● Share Sheet
● Bubbles
● etc...
Android Q で対応が必要なこと
● Gestural Navigation
● Dark Theme
● SYSTEM_ALERT_WINDOW deprecated
● android.preference deprecated
● バックグラウンドでロケーションが必要な場合、追加のPermissionが必要
● Share Sheet
● Bubble
● etc...
今日はここ
Gestural Navigation
Gestural Navigation?
画面遷移などのジェスチャーのこと。
Navigation Barの設定によって変わる
Navigation Barのタイプ
3-button Navigation
2-button Navigation
Full Gestural Navigation
Navigationの動き
なぜ生まれたか?
Navigation Barはメーカーによってデザインは異なるため、
アプリ開発は難しくなってきている
そのため、ベースを統一したかった
Gestural Navigation
● Gestureは2種類
○ 画面左右からスワイプで「戻る」挙動
○ 画面下部からスワイプでアプリ切り替え
● 将来的には2種類のNav Modeをサポート
○ 3-button Navigation
○ Full Nav Gesture Mode
● Gestureは奪うことも可能
Gestureの種類
● 画面左右からスワイプ
○ 「戻る」挙動(右も!)
Gestureの種類
● 画面下部からスワイプ:アプリ切り替え
○ 必須。殺せない
○ 指を離したらonPause→onStopが呼ばれる
○ 戻ってきたらonRestart→onResumeが呼ばれる
Gestural Navigation対応へのロードマップ
1. UIを “edge-to-edge” にする
2. 端にあるWidgetでGestureと競合するものをいい感じにする
例)DrawerLayoutやImageCropのポイント
UIを “edge-to-edge” にする
● Step1. Status Barの後ろにも描画する(推奨)
UIを “edge-to-edge” にする
● Step2. Navigation Barの後ろにも描画する(強く推奨)
UIを “edge-to-edge” にする
● Step2. Navigation Barの後ろにも描画する(強く推奨)
a. 古いOSバージョンの場合はNavigation Barを半透明にすること
b. ScrollViewとかは一番下に「Navigation Barの分の余白」を追加する必要
がある
c. Bottom SheetsはNavigation Barの領域も含めたサイズにする
UIを “edge-to-edge” にする
● 備考
Navigation Barの裏に色の濃いものが来た場合、システムボタンは色が自動で
変わる
UIを “edge-to-edge” にする
● Step3. Insets
a. System Window Inset(Navigation Barとか)
i. クリック可能なViewは避けて配置する(例:FAB)
ii. 3 Button Navigation Barの場合は、更に上に設置することになる
Gestureと競合するものをいい感じにする
● 画面の端に
ドラッグできるものを
置きたい
Gestureと競合するものをいい感じにする
View.setSystemGestureExclusionRects()
で競合を奪うことが可能
Gestureと競合するものをいい感じにする
override fun onDraw(canvas: Canvas?) {
//..
ViewCompat.setSystemGestureExclusionRects(this, rects)
}
● setSystemGestureExclusionRectsは
onLayout もしくは onDraw で呼ぶ(onDrawの方がいいかも?)
Gestureと競合するものをいい感じにする
override fun onDraw(canvas: Canvas?) {
//..
val isSupplyGestureExclusion = BuildCompat.isAtLeastQ()
if (isSupplyGestureExclusion) {
ViewCompat.setSystemGestureExclusionRects(this, rects)
}
}
● ちゃんとやるならこう?
Gestureと競合するものをいい感じにする
・DrawerLayoutとSeekBarは別途AndroidXで対応される
https://developer.android.com/jetpack/androidx/releases/drawerlayout#1.1.0-alpha01
ちゃんと中で
ViewCompat.setSystemGestureExclusionRects(this, rects);
が呼ばれてる
(けど…Javaなんやな…)
DrawerLayoutはまだ検討中なのかも
Dark Theme
なぜ生まれたか?
● アプリをより暗い環境でも使いやすくす
るするため
○ 暗い部屋や暗い環境でも使えるように。アプリ
を使えるシチュエーションを広げる
● バッテリーを守る
○ 最大60%は削減できる
● 目の保養
適用方法
● Force Dark
○ アプリへ自動的にダークモードを適用する
(これだけでイケるかもしれない:Android Qだけで適用される)
● Custom Dark
○ 「ダークモードの時は何色にする」と独自に指定
○ こっちのほうがデザインとして圧倒的に良い(工数はかかる)
Force Dark
● 適用方法
○ <item name="android:forceDarkAllowed">true</item>
○ DayNight Themeを使う(Material Componentでもいいです)
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
Custom Dark
● Dark Modeのときに使う -nightリソースも作ることができる
○ 通常:values/themes.xml
○ Dark Mode:values-night/themes.xml
AppCompatへ「どのモード?」を伝える
● モードの種別:Int(AppCompatDelegete)
○ MODE_NIGHT_AUTO_BATTERY:バッテリーセーバーがONでナイトモード
○ MODE_NIGHT_NO:ナイトモードを使わない
○ MODE_NIGHT_YES:ナイトモードを常に使う
○ MODE_NIGHT_FOLLOW_SYSTEM:端末の設定に従う
○ MODE_NIGHT_AUTO_TIME:deprecated
AppCompatDelegate.setDefaultNightMode(mode:Int);
getDelegate().setLocalNightMode(mode:Int);
画像もダークテーマ対応が必要
values-night/colors.xml values/colors.xml
アプリではテーマを選べるようにすべき
ちなみに
● アプリ起動中にDark ThemeのON/OFFを切り替えると、ア
プリが再起動されます
○ onPause
○ onStop
○ onDestroy
○ ↓
○ onCreate
○ onStart
○ onResume
まとめ
● Gestural Navigation
○ アプリは画面全体に表示
○ 左右はあける。ただしDrawerLayoutはAndroidXでいい感じにしてくれる
○ どうしても左右にモノを置きたい場合は
View.setSystemGestureExclusionRects(listOf(Rect(a,a,a,a))を使う
● Dark Theme
○ Force Darkで意外となんとかなる
けどなんとかならない所もあるのでThemeでちゃんとやろう
○ アプリでテーマを選べるようにすべき
○ 画像もダークテーマ対応が必要
○ 「対応しないという選択肢」はない
ご清聴ありがとうございました

More Related Content

More from furusin

ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみたネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
furusin
 

More from furusin (11)

Jetpack datastore入門
Jetpack datastore入門Jetpack datastore入門
Jetpack datastore入門
 
コロナ禍でコミュニティ運営はこう変わった
コロナ禍でコミュニティ運営はこう変わったコロナ禍でコミュニティ運営はこう変わった
コロナ禍でコミュニティ運営はこう変わった
 
Android dev summit 2019 recap
Android dev summit 2019 recapAndroid dev summit 2019 recap
Android dev summit 2019 recap
 
Android billing library 2.0 recap
Android billing library 2.0 recapAndroid billing library 2.0 recap
Android billing library 2.0 recap
 
社内システムにおける 「使いやすさ」の重要性
社内システムにおける 「使いやすさ」の重要性社内システムにおける 「使いやすさ」の重要性
社内システムにおける 「使いやすさ」の重要性
 
デザインフローについて考え直す
デザインフローについて考え直すデザインフローについて考え直す
デザインフローについて考え直す
 
Build your first wear app
Build your first wear appBuild your first wear app
Build your first wear app
 
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみたネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
 
Pray for hokkaido from osaka
Pray for hokkaido from osakaPray for hokkaido from osaka
Pray for hokkaido from osaka
 
Google Codelabsをやってみた
Google CodelabsをやってみたGoogle Codelabsをやってみた
Google Codelabsをやってみた
 
個人開発アプリの紹介と実装内容の概要
個人開発アプリの紹介と実装内容の概要個人開発アプリの紹介と実装内容の概要
個人開発アプリの紹介と実装内容の概要
 

Android Qにおける Gestural Navigation and Dark Theme