Closed18

Designing a high quality app with the latest Android features

rkonnorkonno

3つのAndroidの最新機能を使って、高品質なアプリを設計する

  • ユーザーはアプリがモダンでエレガントで、パーソナルで、アクセスしやすいものであることを望んでいる
  • それらを実現する上で助けになるAndroidプラットフォームで提供される3つの最新機能

Platform features
Androidプラットフォームの3つの最新機能 (0:42)

1. Premium layout with edge to edge

高級感のあるレイアウトと没入感を実現する Edge to Edge

2. Delightful navigation with predictive back gesture

予測可能で、情報量の多い、より快適なバックジェスチャー

3. Accessible color system with dynamic color

アクセシビリティに配慮したモダンなカラーシステムの設計

rkonnorkonno

1. Premium layout with edge to edge

Android11 以降、ナビゲーションが透明化されることを待ち望む声があった

  • ナビゲーションバーを透明にすることが、Androidユーザーからの重要なフィードバックだった
  • Android 13だけでなく、11と12でも同じ要望があったため、Android 11以降はステータスバーとナビゲーションバーの背後に描画範囲を広げることを推奨している

透明なナビゲーションバーを望むユーザーの声
透明なナビゲーションバーを望むユーザーの声 (1:28)

rkonnorkonno

Edge to Edge に関連する API

  • システムUIとの重なりを避けるには、プラットフォームが提供する WindowInsets を使用するか、Android XのWindowInsetsCompat を使用する

Edge to edgeでレイアウトを構築する
Edge to edgeでレイアウトを構築する (1:43)

rkonnorkonno

Google Slides, Gmail での対応例

  • Google Slides
    • スクロールするとコンテンツはステータスバーとナビゲーションバーの下に描画されている
    • FAB(floating action button)はスクロールしても固定されたままになっている
  • Gmail
    • ボトムナビゲーションバーの下に描画されていない
    • ボトムナビゲーションバーの色との調和が取れている

Google スライドとGmailでの対応例
Google スライドとGmailでの対応例 (2:10)

rkonnorkonno

Edge to edge の実装方法

1. Theme を編集する

  • ステータスバーとナビゲーションバーを透明に設定する(@android:color/transparent)
  • この設定は Compose または View ベースに関わらず必要

2. Activity で setDecorFitsSystemWindows を呼び出す

  • Activity で WindowCompat.setDecorFitsSystemWindows を呼び出し、ウィンドウの互換性を false とする
    • true の場合は、システムウィンドウ内に収まるように制御される
    • false の場合は、システムウィンドウの背後にも描画するように制御する

edge to edge の実装方法
edge to edge の実装方法 (2:43)

rkonnorkonno

FAB(floating action button)の padding の処理

  • Jetpack Compose および Material 3 で更新された scaffold を使用すれば、スクロール中に FAB を固定し続けることができる
    • また、inset の padding は自動的に処理されるため Modifer を使ってさらにカスタマイズすることがなければコードの追記は必要ない
  • View ベースのコンテンツについては、システムバーとナビゲーションバーに対して windowinsets.getinsets を呼び出して、任意の padding を追加する処理が必要になる
  • これらの変更によって、モバイルだけでなくフォルダブルやタブレットでもその恩恵を受けることができる

Material 3 の scaffold を使えば自動的に処理される
Material 3 の scaffold を使えば自動的に処理される (3:33)

モバイルだけでなく、フォルダブルやタブレットにも対応できた
モバイルだけでなく、フォルダブルやタブレットにも対応できた(4:05)

rkonnorkonno

2. Delightful navigation with predictive back gesture

予測可能な「戻る」で楽しいナビゲーションを作る

  • ジェスチャーナビゲーションは、高速で、自然で、人間工学に基づいたインタラクションモデル
  • 戻るジェスチャーは最もよく使われる方法だが、誤ってアプリを終了してしまうケースも見受けられ、Google では、これを "falsing" と呼んでいる
  • ユーザーは、アプリをナビゲートするとき、ジェスチャーの行き先を示す視覚的な手がかりが欲しいと考えている
    • 特に行き先がアプリの外であれば、なおさら手がかりが重要になる
  • "falsing" が何らかのメトリクスに影響を与えている可能性は十分にある

「ホーム画面の前の最後の画面にいることがわからない」というユーザーの声
「ホーム画面の前の最後の画面にいることがわからない」というユーザーの声 (4:20)

rkonnorkonno

Ahead-of-time モデルによって予測アニメーションをサポートする

  • Android 13では、アプリがよりエレガントで有益に感じられるように、また、すべてのアプリに一貫した感じを与えるために予測可能な「戻る」ジェスチャーをリリースした
  • ユーザーがスワイプして戻ろうすると、ホーム画面がチラッと見えて、アプリの外に戻ることを知らせる
  • この予測アニメーションをサポートするために、System back は Ahead-of-time モデルへ移行した
  • Android 13以降では、アプリ内で System back のイベントを処理する場合は事前にシステムに伝える必要がある
  • 次の「戻る」ジェスチャがアプリ内バックスタックをポップするのか、ランチャーに戻るのかをシステムが事前に知っているため、アプリを終了してランチャーを表示するヒントをプレビューすることができる

予測可能な「戻る」ジェスチャーの仕組み
予測可能な「戻る」ジェスチャーの仕組み (4:51)

rkonnorkonno

予測可能な「戻る」をオプトインする

  • Android 13 以降、AndroidManifest で enableOnBackInvokedCallbacktrue に設定することで、オプトインすることが可能
  • アプリ内で「戻る」処理をカスタムしていない場合、必要な作業はこれだけで良い
  • このフラグが設定されると KEYCODE_BACKonBackPressed() などが機能しなくなる

オプトイン方法
オプトイン方法 (6:38)

rkonnorkonno

Android 14 では、アプリ内でも同様の体験に

  • Android 14では、アプリ内でスワイプしたときにも同様の体験が可能になる
  • デフォルトまたはカスタムのアニメーションを活用することで、ユーザーは「戻る」によってどこへ遷移するのかを予測できるようになる(Coming soon)

アプリ内でも同様の体験が可能になる
アプリ内でも同様の体験が可能になる (7:58)

rkonnorkonno

3. Accessible color system with dynamic color

ダイナミックカラーを使ったアクセシブルなカラーシステムの構築

  • 色によって「ブランドを表現したい」「さまざまな照明の下でも見やすく」「ユーザーの好みを反映させたい」
  • ユーザーはアプリがアクセシブルで表現豊かであることを望んでいる
  • 一方で、開発者はカラーシステムがスケーラブルであることを望んでいる
  • 多くのカラーシステムを扱うことで、色の管理が難しくなってきている

アクセシブルなカラーシステムの構築
アクセシブルなカラーシステムの構築 (8:17)

rkonnorkonno

Android 12 以降で利用可能な「ダイナミックカラー」

  • Android 12 以降で利用可能なダイナミックカラーをリリースした
  • ダイナミックカラーとMaterial Youによって、ユーザーのデバイス全体にわたって色のパーソナライズが可能になり、アプリがユーザーに寄り添うことができるようになった

ダイナミックカラーをリリース
ダイナミックカラーをリリース (8:41)

  • カスタムパレットは、個人の壁紙から生成される
  • Android 13では、さらに多くのパレットを可能にするカラーバリエーションをリリースした

ユーザーが設定した壁紙からカスタムパレットを生成する
ユーザーが設定した壁紙からカスタムパレットを生成する (9:00)

rkonnorkonno

ダイナミックカラーの基本原則

  • アクセシビリティを高めることが、万人のためのデザインをする唯一の方法であり、プロダクトができるだけ多くの人を受け入れられることに繋がる
  • 画像の例では、オレンジとグリーンという2つの異なる色相が見られるが、グレースケールで表示すると両者のコントラストがほとんどないことがわかる
  • 彩度とトーンを更新することで、色相はそのままに、グレースケール時のコントラスト比を改善することができる

改善前では、コントラストがほとんどない
改善前では、コントラストがほとんどない (9:16)

彩度とトーンの更新で、コントラスト比が改善
彩度とトーンの更新で、コントラスト比が改善 (9:36)

rkonnorkonno

デザイントークンによって柔軟性と一貫性を実現する

  • デザイントークンにより、エンジニアがUIにおける要素の色を値で設定するのではなく、役割を割り当てることができるようになり、製品全体の柔軟性と一貫性が生まれる
  • 統一されたカラーシステムが生まれ、デザイナーとエンジニアが同じカラートークンで足並みを揃えることで、コラボレーションのしやすさが向上する

スケーラブルなデザイントークン
スケーラブルなデザイントークン (10:01)

rkonnorkonno

ダイナミックカラーを導入する(Composeの場合)

  • デフォルトの Light Color および Dark Color の配色を定義する
    • テーマを作成するときにブランドカラーや、意味的に重要となる色などは必要に応じてカスタムのカラートークンを追加することも可能

デフォルトの Light Color および Dark Color の配色を定義
デフォルトの Light Color および Dark Color の配色を定義 (10:18)

  • Android のバージョンごとに、アプリのテーマを作成する

アプリのテーマを作成する
アプリのテーマを作成する (10:51)

rkonnorkonno

アプリアイコンもダイナミックカラーに対応する

  • アプリだけでなく、ホーム画面のアプリアイコンもダイナミックカラーに対応可能(Android 13+)
  • 対応手順(2ステップ)
      1. SVGアイコン(ベクター形式のDrawable)を採用
      1. ベクター形式のDrawableに monochhrome タグを追加する

monochrome タグを追加する
monochrome タグを追加する (11:30)

このスクラップは2022/11/22にクローズされました