Wear OS 向け Compose でマテリアル 2.5 からマテリアル 3 に移行する

Material 3 Expressive はマテリアル デザインの進化版です。最新のテーマ設定、コンポーネント、パーソナライズ機能(ダイナミック カラーなど)などが含まれています。

このガイドでは、アプリ向けに Wear Compose Material 2.5(androidx.wear.compose)Jetpack ライブラリから Wear Compose Material 3(androidx.wear.compose.material3)Jetpack ライブラリへの移行に焦点を当てます。

アプローチ

アプリコードを M2.5 から M3 に移行するには、Compose Material 移行のスマートフォン向けガイダンスでの説明と同様のアプローチに従います。特に、次の点に注意してください。

依存関係

M3 には、M2.5 とは別個のパッケージとバージョンがあります。

M2.5

implementation("androidx.wear.compose:compose-material:1.4.0")

M3

implementation("androidx.wear.compose:compose-material3:1.6.0")

最新の M3 バージョンについては、Wear Compose Material 3 のリリースページをご覧ください。

Wear Compose Foundation ライブラリ バージョン 1.6.0 では、Material 3 コンポーネントと連携するように設計された新しいコンポーネントがいくつか導入されました。同様に、Wear OS 6(API レベル 36)以降で実行されている場合、Wear Compose Navigation ライブラリの SwipeDismissableNavHost のアニメーションが更新されます。Wear Compose Material 3 バージョンに更新する際は、Wear Compose Foundation ライブラリと Navigation ライブラリも更新することをおすすめします。

implementation("androidx.wear.compose:compose-foundation:1.6.0")
implementation("androidx.wear.compose:compose-navigation:1.6.0")

テーマ

テーマ コンポーザブルは M2.5 と M3 のどちらでも MaterialTheme という名前ですが、インポート パッケージとパラメータが異なります。M3 では、Colors パラメータの名前が ColorScheme に変更され、トランジションを実装するために MotionScheme が導入されました。

M2.5

import androidx.wear.compose.material.MaterialTheme

MaterialTheme(
    colors = AppColors,
    typography = AppTypography,
    shapes = AppShapes,
    content = content
)

M3

import androidx.wear.compose.material3.MaterialTheme
// ...
    MaterialTheme(
        colorScheme = ColorScheme(),
        typography = Typography(),
        shapes = Shapes(),
        motionScheme = MotionScheme.standard(),
        content = { /*content here*/ }
    )

M3 のカラーシステムは M2.5 とは大きく異なります。カラー パラメータの数が増えており、名前と M3 コンポーネントへのマッピングが異なります。これは、Compose では、M2.5 の Colors クラス、M3 の ColorScheme クラス、および関連する関数に適用されます。

M2.5

import androidx.wear.compose.material.Colors

val appColorScheme: Colors = Colors(
   // M2.5 Color parameters
)

M3

import androidx.wear.compose.material3.ColorScheme
// ...
    val appColorScheme: ColorScheme = ColorScheme(
        // M3 ColorScheme parameters
    )

次の表に、M2.5 と M3 の主な違いを示します。

M2.5 M3
Color 名前が ColorScheme に変更されました
13 色 28 色
なし 新しいダイナミック カラーテーマ設定
なし 表現の幅を広げる第 3 のカラー

動的なカラーテーマ設定

M3 の新機能にダイナミック カラーテーマ設定があります。ユーザーがウォッチ フェイスの色を変更すると、UI の色もそれに合わせて変更されます。

dynamicColorScheme 関数を使用してダイナミック カラーパターンを実装し、ダイナミック カラーパターンが使用できない場合にフォールバックとして defaultColorScheme を指定します。

@Composable
fun myApp() {
    val dynamicColorScheme = dynamicColorScheme(LocalContext.current)
    MaterialTheme(colorScheme = dynamicColorScheme ?: myBrandColors) {}
}

internal val myBrandColors: ColorScheme = ColorScheme( /* Specify colors here */)

タイポグラフィ

M3 のタイポグラフィ システムは M2.5 とは異なり、次の機能が含まれています。

  • 9 つの新しいテキスト スタイル
  • フレックス フォント。さまざまな太さ、幅、丸みに対して文字スケールをカスタマイズできます。
  • AnimatedText(フレックス フォントを使用)

M2.5

import androidx.wear.compose.material.Typography

val Typography = Typography(
   // M2.5 TextStyle parameters
)

M3

import androidx.wear.compose.material3.Typography

val Typography = Typography(
    // M3 TextStyle parameters
)

フレックス フォント

フレックス フォントを使用すると、特定のサイズに対して文字幅と太さを指定できます。

テキストのスタイル

M3 では、次の TextStyle を使用できます。これらは、さまざまな M3 コンポーネントでデフォルトで使用されます。

タイポグラフィ TextStyle
ディスプレイ displayLarge、displayMedium、displaySmall
タイトル titleLarge、titleMedium、titleSmall
ラベル labelLarge、labelMedium、labelSmall
本文 bodyLarge、bodyMedium、bodySmall、bodyExtraSmall
数字 numeralExtraLarge、numeralLarge、numeralMedium、numeralSmall、numeralExtraSmall
Arc arcLarge、arcMedium、arcSmall

図形

M3 のシェイプ システムは M2.5 とは異なります。シェイプ パラメータの数が増えており、名前と M3 コンポーネントへのマッピングが異なります。次のシェイプ サイズを使用できます。

  • 特小
  • 特大

これは、Compose では、M2 の Shapes クラスと M3 の Shapes クラスに適用されます。

M2.5

import androidx.wear.compose.material.Shapes

val Shapes = Shapes(
   // M2.5 Shapes parameters
)

M3

import androidx.wear.compose.material3.Shapes

val Shapes = Shapes(
    // M3 Shapes parameters
)

Compose で Material 2 から Material 3 に移行するのシェイプ パラメータ マッピングを起点として使用します。

シェイプ モーフィング

M3 では、シェイプ モーフィングが導入されました。シェイプが操作に応じてモーフィングするようになりました。

シェイプ モーフィング動作は、いくつかの丸いボタンのバリエーションとして利用できます。シェイプ モーフィングをサポートするボタンのリストは次のとおりです。

ボタン 図形のモーフィング機能
IconButton IconButtonDefaults.animatedShape は、押下時にアイコン ボタンをアニメーション化します
IconToggleButton IconToggleButtonDefaults.animatedShape は、押下時にアイコン切り替えボタンをアニメーション化し、
IconToggleButtonDefaults.variantAnimatedShapes は、押下時とチェック/チェック解除時にアイコン切り替えボタンをアニメーション化します
TextButton TextButtonDefaults.animatedShape は、押下時にテキスト ボタンをアニメーション化します
TextToggleButton TextToggleButtonDefaults.animatedShapes は、押下時にテキスト トグルをアニメーション化し、TextToggleButtonDefaults.variantAnimatedShapes は、押下時とチェック/チェック解除時にテキスト トグルをアニメーション化します。

コンポーネントとレイアウト

M2.5 のコンポーネントとレイアウトのほとんどは M3 でも提供されています。ただし、一部の M3 コンポーネントとレイアウトは M2.5 に存在しませんでした。さらに、一部の M3 コンポーネントには、M2.5 の同等のコンポーネントよりも多くのバリエーションがあります。

コンポーネントによっては特別な考慮が必要ですが、出発点として次の関数マッピングを使用することをおすすめします。

Material 2.5 Material 3
androidx.wear.compose.material.dialog.Alert androidx.wear.compose.material3.AlertDialog
androidx.wear.compose.material.Button androidx.wear.compose.material3.IconButton または androidx.wear.compose.material3.TextButton
androidx.wear.compose.material.Card androidx.wear.compose.material3.Card
androidx.wear.compose.material.TitleCard androidx.wear.compose.material3.TitleCard
androidx.wear.compose.material.AppCard androidx.wear.compose.material3.AppCard
androidx.wear.compose.material.Checkbox M3 に同等の API なし。androidx.wear.compose.material3.CheckboxButton または androidx.wear.compose.material3.SplitCheckboxButton に移行
androidx.wear.compose.material.Chip androidx.wear.compose.material3.Button または
androidx.wear.compose.material3.OutlinedButton または
androidx.wear.compose.material3.FilledTonalButton または
androidx.wear.compose.material3.ChildButton
androidx.wear.compose.material.CompactChip androidx.wear.compose.material3.CompactButton
androidx.wear.compose.material.InlineSlider androidx.wear.compose.material3.Slider
androidx.wear.compose.material.LocalContentAlpha() Material 3 の Text または Icon で使用されていないため削除
androidx.wear.compose.material.PositionIndicator androidx.wear.compose.material3.ScrollIndicator
androidx.wear.compose.material.RadioButton M3 に同等の API なし。androidx.wear.compose.material3.RadioButton または androidx.wear.compose.material3.SplitRadioButton に移行
androidx.wear.compose.material.SwipeToRevealCard androidx.wear.compose.material3.SwipeToReveal
androidx.wear.compose.material.SwipeToRevealChip androidx.wear.compose.material3.SwipeToReveal
android.wear.compose.material.Scaffold androidx.wear.compose.material3.AppScaffoldandroidx.wear.compose.material3.ScreenScaffold
androidx.wear.compose.material.SplitToggleChip M3 に相当なし。androidx.wear.compose.material3.SplitCheckboxButtonandroidx.wear.compose.material3.SplitSwitchButton、または androidx.wear.compose.material3.SplitRadioButton に移行
androidx.wear.compose.material.Switch M3 に相当なし。androidx.wear.compose.material3.SwitchButton または androidx.wear.compose.material3.SplitSwitchButton に移行
androidx.wear.compose.material.ToggleButton androidx.wear.compose.material3.IconToggleButton または androidx.wear.compose.material3.TextToggleButton
androidx.wear.compose.material.ToggleChip androidx.wear.compose.material3.CheckboxButton または
androidx.wear.compose.material3.RadioButton または
androidx.wear.compose.material3.SwitchButton
androidx.wear.compose.material.Vignette Wear OS 向け Material 3 Expressive デザインに含まれていないため削除

Material 3 のコンポーネントの完全なリストは次のとおりです。

Material 3 Material 2.5 と同等のコンポーネント(M3 で新しくない場合)
androidx.wear.compose.material3.AlertDialog androidx.wear.compose.material.dialog.Alert
androidx.wear.compose.material3.AnimatedPage 新規
androidx.wear.compose.material3.AnimatedText 新規
androidx.wear.compose.material3.AppScaffold android.wear.compose.material.Scaffoldandroidx.wear.compose.material3.ScreenScaffold を使用)
androidx.wear.compose.material3.Button androidx.wear.compose.material.Chip
androidx.wear.compose.material3.ButtonGroup 新規
androidx.wear.compose.material3.Card androidx.wear.compose.material.Card
androidx.wear.compose.material3.CheckboxButton チェックボックスの切り替えコントロールを備えた androidx.wear.compose.material.ToggleChip
androidx.wear.compose.material3.ChildButton androidx.wear.compose.material.Chip(背景が不要な場合のみ)
androidx.wear.compose.material3.CircularProgressIndicator androidx.wear.compose.material.CircularProgressIndicator
androidx.wear.compose.material3.CompactButton androidx.wear.compose.material.CompactChip
androidx.wear.compose.material3.ConfirmationDialog androidx.wear.compose.material.dialog.Confirmation
androidx.wear.compose.material3.curvedText androidx.wear.compose.material.curvedText
androidx.wear.compose.material3.DatePicker 新規
androidx.wear.compose.material3.Dialog androidx.wear.compose.material.dialog.Dialog
androidx.wear.compose.material3.EdgeButton 新規
androidx.wear.compose.material3.FadingExpandingLabel 新規
androidx.wear.compose.material3.FilledTonalButton 色調ボタンの背景が必要な場合は androidx.wear.compose.material.Chip
androidx.wear.compose.material3.HorizontalPageIndicator androidx.wear.compose.material.HorizontalPageIndicator
androidx.wear.compose.material3.HorizontalPagerScaffold 新規
androidx.wear.compose.material3.Icon androidx.wear.compose.material.Icon
androidx.wear.compose.material3.IconButton androidx.wear.compose.material.Button
androidx.wear.compose.material3.IconToggleButton androidx.wear.compose.material.ToggleButton
androidx.wear.compose.material3.LevelIndicator 新規
androidx.wear.compose.material3.LinearProgressIndicator 新規
androidx.wear.compose.material3.ListHeader androidx.wear.compose.material.ListHeader
androidx.wear.compose.material3.ListSubHeader 新規
androidx.wear.compose.material3.MaterialTheme androidx.wear.compose.material.MaterialTheme
androidx.wear.compose.material3.OpenOnPhoneDialog 新規
androidx.wear.compose.material3.Picker androidx.wear.compose.material.Picker
androidx.wear.compose.material3.PickerGroup androidx.wear.compose.material.PickerGroup
androidx.wear.compose.material3.RadioButton ラジオボタンの切り替えコントロールを備えた androidx.wear.compose.material.ToggleChip
androidx.wear.compose.material3.ScreenScaffold android.wear.compose.material.Scaffoldandroidx.wear.compose.material3.AppScaffold を使用)
androidx.wear.compose.material3.ScrollIndicator androidx.wear.compose.material.PositionIndicator
androidx.wear.compose.material3.scrollAway androidx.wear.compose.material.scrollAway
androidx.wear.compose.material3.SegmentedCircularProgressIndicator 新規
androidx.wear.compose.material3.Slider androidx.wear.compose.material.InlineSlider
androidx.wear.compose.material3.SplitRadioButton androidx.wear.compose.material.SplitToggleChip
androidx.wear.compose.material3.SplitCheckboxButton androidx.wear.compose.material.SplitToggleChip
androidx.wear.compose.material3.SplitSwitchButton androidx.wear.compose.material.SplitToggleChip
androidx.wear.compose.material3.Stepper androidx.wear.compose.material.Stepper
androidx.wear.compose.material3.SwipeToDismissBox androidx.wear.compose.material.SwipeToDismissBox
androidx.wear.compose.material3.SwipeToReveal androidx.wear.compose.material.SwipeToRevealCardandroidx.wear.compose.material.SwipeToRevealChip
androidx.wear.compose.material3.SwitchButton スイッチ切り替えコントロールを備えた androidx.wear.compose.material.ToggleChip
androidx.wear.compose.material3.Text androidx.wear.compose.material.Text
androidx.wear.compose.material3.TextButton androidx.wear.compose.material.Button
androidx.wear.compose.material3.TextToggleButton androidx.wear.compose.material.ToggleButton
androidx.wear.compose.material3.TimeText androidx.wear.compose.material.TimeText
androidx.wear.compose.material3.VerticalPagerScaffold 新規

最後に、Wear Compose Foundation ライブラリの関連コンポーネントのリストを示します。

Wear Compose Foundation 1.6.0
androidx.wear.compose.foundation.hierarchicalFocusGroup アプリケーション内のコンポーザブルにアノテーションを付け、コンポジションのアクティブな部分を追跡してフォーカスを調整するために使用されます。
androidx.wear.compose.foundation.pager.HorizontalPager Compose Foundation コンポーネントをベースに構築された水平スクロール ページャ。パフォーマンスを向上させ、Wear OS ガイドラインに準拠するための Wear 固有の拡張機能が備わっています。
androidx.wear.compose.foundation.pager.VerticalPager Compose Foundation コンポーネントをベースに構築された縦スクロール ページャー。パフォーマンスを向上させ、Wear OS ガイドラインに準拠するための Wear 固有の機能強化が施されています。
androidx.wear.compose.foundation.lazy.TransformingLazyColumn ScalingLazyColumn の代わりに、各アイテムにスクロール変換効果を追加するために使用できます。

ボタン

M3 のボタンは M2.5 とは異なります。M2.5 チップはボタンに置き換えられました。Button の実装では、TextmaxLinestextAlign のデフォルト値が提供されます。これらのデフォルト値は、Text 要素でオーバーライドできます。

M2.5

import androidx.wear.compose.material.Chip

//M2.5 Buttons
Chip(...)
CompactChip(...)
Button(...)

M3

//M3 Buttons
Button(onClick = { }){}
CompactButton(onClick = { }){}
IconButton(onClick = { }){}
TextButton(onClick = { }){}

M3 には、新しいボタンのバリエーションもあります。それらについては、Compose Material 3 API リファレンスの概要でご確認ください。

M3 では、新しいボタン EdgeButton が導入されています。EdgeButton には、特小、小、中、大の 4 つのサイズがあります。EdgeButton 実装では、サイズに応じて maxLines のデフォルト値が提供されます。この値はカスタマイズできます。

TransformingLazyColumn または ScalingLazyColumn を使用している場合は、EdgeButtonScreenScaffold に渡して、最終的なリストアイテムとして EdgeButton を追加するのではなく、スクロールに合わせてシェイプが変化するようにします。ScreenScaffoldTransformingLazyColumnEdgeButton を使用する方法については、次のコードをご覧ください。

val state = rememberTransformingLazyColumnState()
ScreenScaffold(
    scrollState = state,
    contentPadding =
        rememberResponsiveColumnPadding(
            first = ColumnItemType.ListHeader
        ),
    edgeButton = {
        EdgeButton(
            onClick = { }
        ) {
            Text(stringResource(R.string.show))
        }
    }
){ contentPadding ->
    TransformingLazyColumn(state = state, contentPadding = contentPadding,){
        // additional code here
    }
}

Scaffold

M3 の Scaffold は M2.5 とは異なります。M3 では、AppScaffold と新しい ScreenScaffold コンポーザブルが Scaffold に置き換わりました。AppScaffoldScreenScaffold は、画面の構造をレイアウトし、ScrollIndicator コンポーネントと TimeText コンポーネントの遷移を調整します。

AppScaffold を使用すると、「スワイプして閉じる」などのアプリ内の遷移中に、TimeText などの静的画面要素を表示したままにできます。​​メイン アプリケーション コンテンツ用のスロットを提供します。通常、SwipeDismissableNavHost などのナビゲーション コンポーネントによって提供されます。

Activity に 1 つの AppScaffold を宣言し、各 Screen に ScreenScaffold を使用します。AppScaffold は、デフォルトの TimeText コンポーネントを画面に追加します。timeText パラメータを使用してカスタマイズする場合は、オーバーライドできます。

M2.5

import androidx.wear.compose.material.Scaffold

Scaffold {...}

M3

    AppScaffold {
        val navController = rememberSwipeDismissableNavController()
        SwipeDismissableNavHost(
            navController = navController,
            startDestination = "message_list"
        ) {
            composable("message_list") {
                MessageList(onMessageClick = { id ->
                    navController.navigate("message_detail/$id")
                })
            }
            composable("message_detail/{id}") {
                MessageDetail(id = it.arguments?.getString("id")!!)
            }
        }
    }
}

// Implementation of one of the screens in the navigation
@Composable
fun MessageDetail(id: String) {
    // .. Screen level content goes here
    val scrollState = rememberTransformingLazyColumnState()

    val padding = rememberResponsiveColumnPadding(
        first = ColumnItemType.BodyText
    )

    ScreenScaffold(
        scrollState = scrollState,
        contentPadding = padding
    ) { scaffoldPaddingValues ->
        // Screen content goes here
        // ...

HorizontalPagerIndicatorHorizontalPager を使用している場合は、HorizontalPagerScaffold に移行できます。HorizontalPagerScaffoldAppScaffold 内に配置されます。AppScaffoldHorizontalPagerScaffold は、Pager の構造をレイアウトし、HorizontalPageIndicator コンポーネントと TimeText コンポーネントの遷移を調整します。

HorizontalPagerScaffold は、デフォルトで画面の中央付近に HorizontalPageIndicator を表示し、Pager がページングされているかどうかに応じて TimeTextHorizontalPageIndicator の表示と非表示を調整します。これは PagerState によって決定されます。

また、新しい AnimatedPage コンポーネントもあります。これは、Pager 内のページを、その位置に基づいてスケーリングとスクリム効果でアニメーション化します。

AppScaffold {
    val pagerState = rememberPagerState(pageCount = { 10 })
    val columnState = rememberTransformingLazyColumnState()
    val contentPadding = rememberResponsiveColumnPadding(
        first = ColumnItemType.ListHeader,
        last = ColumnItemType.BodyText,
    )
    HorizontalPagerScaffold(pagerState = pagerState) {
        HorizontalPager(
            state = pagerState,
        ) { page ->
            AnimatedPage(pageIndex = page, pagerState = pagerState) {
                ScreenScaffold(
                    scrollState = columnState,
                    contentPadding = contentPadding
                ) { contentPadding ->
                    TransformingLazyColumn(
                        state = columnState,
                        contentPadding = contentPadding
                    ) {
                        item {
                            ListHeader(
                                modifier = Modifier.fillMaxWidth()
                            ) {
                                Text(text = "Pager sample")
                            }
                        }
                        item {
                            if (page == 0) {
                                Text(text = "Page #$page. Swipe right")
                            }
                            else{
                                Text(text = "Page #$page. Swipe left and right")
                            }
                        }
                    }
                }

            }
        }
    }
}

最後に、M3 では HorizontalPagerScaffold と同じパターンに従う VerticalPagerScaffold が導入されています。

AppScaffold {
    val pagerState = rememberPagerState(pageCount = { 10 })

    VerticalPagerScaffold(pagerState = pagerState) {
        VerticalPager(
            state = pagerState
        ) { page ->
            AnimatedPage(pageIndex = page, pagerState = pagerState) {
                ScreenScaffold {
                    ///…
                }
            }
        }
    }
}

プレースホルダ

M2.5 と M3 の間には API の変更がいくつかあります。Placeholder.PlaceholderDefaults には、次の 2 つの修飾子が用意されています。

  • Modifier.placeholder: まだ読み込まれていないコンテンツの代わりに描画される
  • プレースホルダ シマー効果 Modifier.placeholderShimmer。データの読み込みを待機している間、アニメーション ループで実行されるプレースホルダ シマー効果を提供します。

Placeholder コンポーネントのその他の変更については、次の表をご覧ください。

M2.5 M3
PlaceholderState.startPlaceholderAnimation 削除されました
PlaceholderState.placeholderProgression 削除されました
PlaceholderState.isShowContent 名前が !PlaceholderState.isVisible に変更されました
PlaceholderState.isWipeOff 削除されました
PlaceholderDefaults.painterWithPlaceholderOverlayBackgroundBrush 削除されました
PlaceholderDefaults.placeholderBackgroundBrush 削除されました
PlaceholderDefaults.placeholderChipColors 削除されました

SwipeDismissableNavHost

SwipeDismissableNavHostwear.compose.navigation の一部です。このコンポーネントを M3 で使用すると、M3 MaterialTheme が LocalSwipeToDismissBackgroundScrimColorLocalSwipeToDismissContentScrimColor を更新します。

TransformingLazyColumn

TransformingLazyColumnwear.compose.lazy.foundation の一部であり、スクロール中のリスト項目のスケーリングとモーフィングのアニメーションのサポートを追加し、ユーザー エクスペリエンスを向上させます。アプリを ScalingLazyColumn から TransformingLazyColumn に移行することを強くおすすめします

ScalingLazyColumn と同様に、コンポジション間で記憶される TransformingLazyColumnState を作成するための rememberTransformingLazyColumnState() を提供します。

スケーリング アニメーションとモーフィング アニメーションを追加するには、各リストアイテムに次のコードを追加します。

  • Modifier.transformedHeightTransformationSpec を使用してアイテムの変換後の高さを計算できます。さらなるカスタマイズが必要な場合を除き、rememberTransformationSpec() を使用できます。
  • SurfaceTransformation

リストの上部と下部のパディングが正しいことを確認するには、minimumVerticalContentPadding 修飾子を使用します。

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,
                )
            }
        }
    }
}

Compose における M2.5 から M3 への移行について詳しくは、以下の参考情報をご覧ください。

サンプル

API リファレンスとソースコード

デザイン