wear-compose-m3 について
Wear OS Compose Material3 を扱うコーディングエージェント向けの開発スキルです。バージョン互換性、コンポーネント移行、公式サンプルの参照、Gradle 検証を扱います。
主な機能
- 01ライブラリのバージョンと互換性の確認
- 02Material 2 と Horologist の移行支援
- 03コンポーネント別の公式サンプル参照
- 04Gradle 同期とビルド検証の徹底
活用シーン
- 01Wear Compose Material3 の依存関係更新
- 02Horologist コンポーネントの Material3 移行
- 03Wear OS コンポーネントの参考サンプル検索
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ android/ skills --skill wear-compose-m3インストール後、Claude Code で/wear-compose-m3を入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/android/training/wearables/compose/migrate-to-material3.mdreferences/foundation/AmbientModeSample.kt.mdCurvedWorldSample.kt.mdExpandableSample.kt.mdHierarchicalFocusSample.kt.mdPagerSamples.kt.mdRotarySamples.kt.mdSwipeToDismissBoxSample.kt.mdTransformingLazyColumnSample.kt.mdreferences/material3/AlertDialogSample.kt.mdAnimatedTextSample.kt.mdButtonGroupSample.kt.mdButtonSample.kt.mdCardSample.kt.mdCheckboxButtonSample.kt.mdConfirmationDialogSample.kt.mdCurvedTextSamples.kt.mdDatePickerSample.kt.mdDynamicColorSchemeSample.kt.mdEdgeButtonSample.kt.mdFadingExpandingLabelSample.kt.mdIconButtonSample.kt.mdIconToggleButtonSample.kt.mdLevelIndicatorSample.kt.mdLinearProgressIndicatorSample.kt.mdListHeaderSample.kt.mdOneHandedGestureSamples.kt.mdOpenOnPhoneDialogSample.kt.mdPageIndicatorSample.kt.mdPagerScaffoldSample.kt.md詳細
前提条件と互換性
- 現在使用中の Wear OS Compose のバージョン: インストールされているライブラリのバージョンを確認するには、
gradle/libs.versions.tomlまたはbuild.gradle.ktsを直接読み取ってください。バージョンを解決するために、./gradlew dependenciesやその他のシェルコマンドを実行しないでください。 - Wear OS Compose Material3 のバージョン:
androidx.wear.compose:compose-material3の最新の安定版{VERSION}を特定できる内部ツールがある場合は、そのツールを使用してください。- それ以外の場合は、公式の Maven メタデータ XMLを取得し、
{VERSION}を特定してください(-alpha、-beta、または-rcを除いた最高の番号)。
- それ以外の場合は、公式の Maven メタデータ XMLを取得し、
- 厳守事項: 安定版として記載されているバージョンがある場合は、ユーザーが変更を指定していない限り、必ずそれを使用してください。エディターで最初に表示された「Unresolved reference」エラーや、古いウェブ検索結果を理由にダウングレードしないでください。
- Kotlin と Compose コンパイラー:
org.jetbrains.kotlin.plugin.composeGradle プラグインを使用し、Kotlin 2.0.0 以降を使用してください。 - 最小 SDK:
minSdkを25以上にしてください。 - コンパイル SDK と AGP: ライブラリの AAR メタデータに記載された最低要件を満たすよう、
compileSdkと AGP を設定してください(1.6.xではcompileSdk >= 35かつAGP >= 8.6.0、1.7.xではcompileSdk >= 37かつAGP >= 9.1.0)。
注意事項
- 同期と検証は必須です:
libs.versions.tomlまたはbuild.gradle.ktsのバージョンを更新した後、リファクタリングの前に Gradle の同期(または./gradlew assembleDebug)を実行し、リファクタリング後にも./gradlew assembleDebugを実行してビルドを検証してください。 - 推測の禁止(エラープロトコル): 同期が成功した後に「Unresolved Reference」や API の不一致が発生した場合、ライブラリのバージョンをダウングレードして「修正」しようとしないでください。
機能とツール
機能 1:移行、更新、機能の追加
古いバージョンの Wear OS Compose または Horologist から移行する場合、既存の Wear Compose Material3 プロジェクトを更新する場合、または機能を追加する場合は、このガイダンスに従ってください。
- 開発者から別途指示がない限り、
{VERSION}の Wear Compose Material3 最新安定版を使用してください(移行ガイド内のリテラルなバージョン文字列より優先します)。 - Material 2.5 または Horologist から移行する場合は、移行ガイドを読み、公式のコンポーネント対応表を使用してください。
- コンポーネントをリファクタリングする前(たとえば、
Chip->Button)に、パラメーター名、スロット型、「Expressive」デザイントークンを確認してください。 - Horologist の Composable、Compose Layout、または Compose Material ライブラリは使用しないでください。Horologist のコンポーネントは、Wear Compose M3 の同等コンポーネントに置き換えてください(
AppScaffold-> M3AppScaffold、ScreenScaffold-> M3ScreenScaffold、ScalingLazyColumn->TransformingLazyColumn、ResponsiveListHeader->ListHeader、PagerScreen->HorizontalPagerScaffold、Chip->Button、Confirmation->ConfirmationDialog)。 - 必ず機能 3 のコンポーネントガイダンスを確認してください。
- コンポーネントを移行または更新すると、スクリーンショットテストが失敗することがあります。パディングと位置のデフォルト値が変更されているためです。以前のスクリーンショットに無理に一致させようとせず、Material3 のデフォルトを優先してください。
機能 2:コンポーネントのサンプル
Wear Compose コンポーネントの正式なサンプルを見つけるには、この参照表を使用してください。 Wear Compose コンポーネントを使用する際は、正しい使用方法を把握するため、表にリンクされたサンプルを必ず参照してください。
重要: [alpha]、[beta]、または[rc]のマークが付いたシンボルは、該当するプレリリース版でのみ使用できます。安定版の{VERSION}には含まれません。プロジェクトがそのプレリリース版を明示的に対象としている場合を除き、使用しないでください。
androidx.wear.compose.material3.* の Material 3 コンポーネント
androidx.wear.compose.foundation.* の基盤コンポーネント
androidx.wear.compose.navigation3.* の Navigation 3 コンポーネント
| コンポーネント / シンボル | リファレンスサンプル |
|---|---|
rememberSwipeDismissableSceneStrategy | SwipeDismissableSceneStrategySample |
ケイパビリティ 3: コンポーネントのガイダンス
必須: このケイパビリティを、あらゆるコンポーネントの使用に対するチェックリストとして使用してください。コンポーネントの構文にとどまらず、各コンポーネントを実際にどのように使用するかについて、より全体的なガイダンスを提供します。
-
AppScaffoldとScreenScaffold- [ ]
AppScaffoldを外側のコンテナとして使用し、その子にScreenScaffoldを配置します。 - [ ]
AppScaffoldは 1 つだけ 使用し、ScreenScaffoldはいくつでも使用できます。
- [ ]
-
ScalingLazyColumn- 代わりにTransformingLazyColumnを使用してください。 -
TransformingLazyColumn- 次のインポートが必要です:import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.TransformingLazyColumnDefaults import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState // ... import androidx.wear.compose.material3.lazy.rememberTransformationSpec import androidx.wear.compose.material3.lazy.transformedHeight
標準的な例:
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, ) } } } }
- [ ]
ScalingLazyColumnの代わりにTransformingLazyColumnを使用してください。 - [ ]
ScreenScaffoldのcontentPaddingパラメータをTransformingLazyColumnに渡す必要があります。 - [ ] 必要な上下のパディングを実現するには、
minimumVerticalContentPadding修飾子を使用してください。- これは
ButtonDefaults、CardDefaults、ListHeaderDefaultsなどのデフォルトからの値を想定しています。 - 注: これは
TransformingLazyColumnItemScope内で使用可能なスコープ付き修飾子です。
- これは
- [ ] アイテムがモーフィングおよびスケーリングすることを確認してください(リスト自体ではなく、
TransformingLazyColumnの 内部 のコンポーネントに適用します):- [ ]
Modifier.transformedHeight(this, transformationSpec)を使用してください。 - [ ]
transformation = SurfaceTransformation(transformationSpec)を使用してください。
- [ ]
- [ ] スナッピング用にリストを構成する場合は、
flingBehaviorとrotaryScrollableBehaviorを 一緒に 使用してください:
val columnState = rememberTransformingLazyColumnState() ScreenScaffold(scrollState = columnState) { contentPadding -> TransformingLazyColumn( state = columnState, flingBehavior = TransformingLazyColumnDefaults.snapFlingBehavior(columnState), rotaryScrollableBehavior = RotaryScrollableDefaults.snapBehavior(columnState) ) { // ... // ... } }
- [ ]
-
ScreenScaffold- [ ]
scrollIndicatorを!LocalScrollCaptureInProgress.current(androidx.compose.ui.platform)でガードしてください。
- [ ]
-
EdgeButton- [ ]
TransformingLazyColumn内の最後のアイテムとして使用しないでください。代わりにScreenScaffoldのスロットを使用してください。 - [ ]
TransformingLazyColumn内で使用する場合は、必要なオーバースクロール動作を追加してください:
val columnState = rememberTransformingLazyColumnState() ScreenScaffold( scrollState = columnState, edgeButton = { EdgeButton( onClick = { /* TODO */ }, modifier = Modifier.scrollable( columnState, orientation = Orientation.Vertical, reverseDirection = true, // Apply overscroll to the EdgeButton for proper scrolling behavior. overscrollEffect = rememberOverscrollEffect(), ) ) { Text("More") } } ) { contentPadding -> TransformingLazyColumn( contentPadding = contentPadding, state = columnState, ) { // ... // ... } }
- [ ]
-
Column- [ ] 最大のシステムフォントを使用しても画面が 決して スクロールしない 場合 は、
ScreenScaffoldの直接の子として使用してください。 - [ ] それ以外のすべてのケースでは、代わりに
TransformingLazyColumnを使用してください。
- [ ] 最大のシステムフォントを使用しても画面が 決して スクロールしない 場合 は、
-
スタイル
- [ ] テキストサイズをハードコードしないでください。
MaterialThemeのtypographyを使用してください。 - [ ] 色をハードコードしないでください。
MaterialThemeのcolorSchemeを使用してください。
- [ ] テキストサイズをハードコードしないでください。
-
コンポーネントのデフォルトを使用する:
- [ ]
Buttonなどのコンポーネントには、対応するButtonDefaultsオブジェクトがあります。 - [ ] パディングとスタイルの値を扱う際は、ハードコードされた値よりも優先して、任意のコンポーネントの
*Defaultsオブジェクトを確認して使用してください。
- [ ]
-
Wear 固有のプレビューアノテーションを使用する (
androidx.wear.compose.ui.tooling.preview):- [ ]
@WearPreviewDevices - [ ]
@WearPreviewFontScales - [ ]
androidx.wear.compose:compose-ui-tooling依存関係が含まれていることを確認してください。
- [ ]
-
アンビエントモード
- [ ]
AmbientLifecycleObserverの代わりにLocalAmbientModeManager(CompositionLocalProviderとrememberAmbientModeManager()によって提供されます)を使用してください。
- [ ]
-
ナビゲーション
- [ ] ナビゲーションを新規に追加する場合は、Navigation3(
androidx.wear.compose:compose-navigation3)を使用してください。 - [ ]
rememberSwipeDismissableSceneStrategy()/SwipeDismissableSceneStrategy(androidx.wear.compose.navigation3)を使用してください。
- [ ] ナビゲーションを新規に追加する場合は、Navigation3(
-
コメント
- [ ] Kotlin ファイルを変更した場合は、既存のコメントが最新であり、実装への変更を正確に反映していることを確認してください。
-
HorizontalPagerまたはVerticalPager- [ ] Composable の階層を次の順序で使用してください:
AppScaffold、HorizontalPagerScaffold、HorizontalPager、AnimatedPage、ScreenScaffold。VerticalPagerの場合も同様です。
- [ ] Composable の階層を次の順序で使用してください: