アプリは、あらゆるサイズの Wear OS デバイスで適切に動作し、使用可能な追加スペースを活用しながら、小さな画面でも美しく表示されるようにする必要があります。 このガイドでは、このようなユーザー エクスペリエンスを実現するための推奨事項について説明します。
アダプティブ レイアウトの設計原則について詳しくは、 設計ガイダンスをご覧ください。
マテリアル 3 を使用してレスポンシブ レイアウトを作成する
レイアウトには、割合ベースのマージンを設定する必要があります。Compose はデフォルトで絶対値で動作するため、rememberResponsiveColumnPadding を使用してパディングを計算し、Horologist Library の ScreenScaffold's contentPadding パラメータとTransformingLazyColumn's contentPadding パラメータに渡します。
次のコード スニペットでは、TransformingLazyColumn コンポーネントを使用して、さまざまな Wear OS 画面サイズで美しく表示されるコンテンツを作成しています。
val columnState = rememberTransformingLazyColumnState() val transformationSpec = rememberTransformationSpec() ScreenScaffold( scrollState = columnState ) { contentPadding -> TransformingLazyColumn( state = columnState, contentPadding = contentPadding ) { item { ListHeader( modifier = Modifier .fillMaxWidth() .transformedHeight(this, transformationSpec) .minimumVerticalContentPadding(ListHeaderDefaults.minimumTopListContentPadding), transformation = SurfaceTransformation(transformationSpec) ) { Text(text = "Header") } } // ... other items item { Button( modifier = Modifier .fillMaxWidth() .transformedHeight(this, transformationSpec) .minimumVerticalContentPadding(ButtonDefaults.minimumVerticalListContentPadding), transformation = SurfaceTransformation(transformationSpec), onClick = { /* ... */ }, icon = { Icon( imageVector = Icons.Default.Build, contentDescription = "build", ) }, ) { Text( text = "Build", maxLines = 1, overflow = TextOverflow.Ellipsis, ) } } } }
この例では、ScreenScaffold と AppScaffold も示しています。
これらは、アプリと個々の画面
(ナビゲーション ルート)の間で連携して、正しいスクロール動作と
TimeText配置を確保します。
上部と下部のパディングについては、次の点にも注意してください。
- 最初と最後の
ItemTypeの仕様。正しいパディングを決定します。 - リストの最初の項目に
ListHeaderを使用します。Textヘッダーにはパディングを設定しないでください。
完全な仕様については、Figma デザインキットをご覧ください。詳細と例については、以下をご覧ください。
- Horologist ライブラリ \- Wear OS 向けに 最適化された差別化されたアプリの作成に役立つヘルパーを提供します。
- ComposeStarter サンプル \- このガイドで説明する 原則を示す例です。
- JetCaster サンプル \- Horologist ライブラリを使用して、さまざまな画面サイズに対応するアプリを作成する、より複雑な例です。
アプリでスクロール レイアウトを使用する
画面を実装する際は、このページで説明したように、スクロール レイアウトをデフォルトの選択肢として使用します。これにより、ディスプレイ設定や Wear OS デバイスの画面サイズに関係なく、ユーザーがアプリのコンポーネントにアクセスできるようになります。
デバイスのサイズとフォント スケーリングが異なる場合の効果。
ダイアログ
ダイアログも、正当な理由がない限り、スクロール可能にする必要があります。
The AlertDialog コンポーネントはレスポンシブで、コンテンツがビューポートの高さを超える場合はデフォルトでスクロールできます。
カスタム画面ではスクロールしないレイアウトが必要になる場合がある
一部の画面では、スクロールしないレイアウトが適している場合があります。たとえば、メディア アプリのメインプレーヤー画面やフィットネス アプリのワークアウト画面などです。
このような場合は、 Figma デザインキットに記載されている標準的なガイダンスを参照し、正しいマージンを使用して、画面サイズ に対応するデザインを実装してください。
ブレークポイントを使用して差別化されたエクスペリエンスを提供する
ディスプレイが大きい場合は、追加のコンテンツや機能を追加できます。このような差別化されたエクスペリエンスを実装するには、画面サイズが 225 dp を超える場合に異なるレイアウトを表示する、画面サイズ ブレークポイントを使用します。
const val LARGE_DISPLAY_BREAKPOINT = 225 @Composable fun isLargeDisplay() = LocalConfiguration.current.screenWidthDp >= LARGE_DISPLAY_BREAKPOINT // ... // ... use in your Composables: if (isLargeDisplay()) { // Show additional content. } else { // Show content only for smaller displays. } // ...
設計ガイダンスでは、このような機会について詳しく説明しています。
プレビューを使用して画面サイズとフォントサイズの組み合わせをテストする
Compose プレビューは、さまざまな Wear OS 画面サイズに対応した開発に役立ちます。 デバイスとフォント スケーリングの両方のプレビュー定義を使用して、次のことを確認します。
- 画面のサイズが極端な場合(たとえば、最大のフォントと最小の画面を組み合わせた場合)の画面の表示。
- ブレークポイント間で差別化されたエクスペリエンスがどのように動作するか。
アプリのすべての画面で WearPreviewDevices と
WearPreviewFontScales を使用してプレビューを実装してください。
@WearPreviewDevices @WearPreviewFontScales @Composable fun ComposeListPreview() { ComposeList() }
スクリーンショット テスト
プレビュー テストに加えて、スクリーンショット テストでは、既存のさまざまなハードウェア サイズに対してテストを行うことができます。これらのデバイスをすぐに使用できない場合や、他の画面サイズでは問題が発生しない場合に特に便利です。
スクリーンショット テストは、コードベースの特定の場所での回帰の特定にも役立ちます。
サンプルでは、スクリーンショット テストに Roborazzi を使用しています。
- Roborazzi を使用するように プロジェクトと アプリ
build.gradleファイルを構成します。 - アプリの各画面のスクリーンショット テストを作成します。たとえば、次のコードは、リストを含む画面のスクリーンショット テストを示しています。
@RunWith(ParameterizedRobolectricTestRunner::class) class ComposeListScreenTest( override val device: WearDevice ) : WearScreenshotTest() { override val tolerance = 0.02f @Test fun myScreenTest() = runTest { AppScaffold { ComposeList() } } companion object { @JvmStatic @ParameterizedRobolectricTestRunner.Parameters fun devices() = WearDevice.entries } }
注意すべき重要な点:
WearDevice.entriesには、最も一般的な Wear OS デバイスの定義が含まれているため、代表的な画面サイズでテストが実行されます。
ゴールデン イメージを生成する
画面の画像を生成するには、ターミナルで次のコマンドを実行します。
./gradlew recordRoborazziDebug
画像を確認する
既存の画像に対する変更を確認するには、ターミナルで次のコマンドを実行します。
./gradlew verifyRoborazziDebug
スクリーンショット テストの完全な例については、ComposeStarter サンプルをご覧ください。