Jetpack Compose: Cardコンポーザブルを使う


今回のJetpack ComposeサンプルはCardコンポーザブルです。Cardはマテリアルデザインのコンポーネントのなかでもよくみる存在で、使いやすいUI表現のひとつです。androidx.compose.materialにおけるCardコンポーザブルは、かなりゆるめの実装なのでデザインにあわせて自分でレイアウトを組み立ててカードの体裁を整えていくことになります。ここでは基本的なカードの作り方を紹介します。

Cardコンポーザブルの利用例

Cardを表示する

バージョン1.0.0-beta07におけるCardコンポーザブルはandroidx.compose.materialのSurfaceの糖衣構文(シンタックスシュガー)です。そのまま利用した場合、あまりカードらしい見た目にはなりません。

シンプルなCardコンポーザブル
@Composable
fun CardSample() {
    Card {
        Text("Card contents is here")
    }
}

マテリアルデザインガイドラインではCardに含めるコンテンツは内部に閉じていること、周囲のコンテキストに依存せず独立していること、別のカードとマージしたり分割したりできない要素であることと定義しています。

Cardコンポーザブルはこの要素をもったコンテンツを入れる容器と考えてください(執筆時点で内部的にはSurfaceそのままです)。すこし中身があるサンプルコンテンツを用意してCardコンポーザブルを使ってみましょう。

マテリアルデザインに準拠したカードを表示する

シンプルなカード実装の例(マテリアルデザインガイドライン(Cards)より引用

次のサンプルではレイアウト幅を親要素にあわせてCardコンポーザブルを表示しています。引数modifierでレイアウトのパディング16dp、コンテンツに応じたサイズを指定します。Cardコンポーザブルのエレベーションはデフォルトで1dpです(モバイルアプリの場合デフォルトは1dp、表示するコンテンツが多く、エレベーションがごちゃっとする場合は0dpを使うこともできます。ドラッグ中は8dpを使ってください)。

@Preview(showBackground = true)
@Composable
fun SimpleCardPreview() {
    Card(modifier = Modifier
        .padding(16.dp)
        .wrapContentSize()
    ) {
        CardContent()
    }
}

今回、Cardのコンテンツは別のコンポーザブル関数(CardContent)に記述しています。画像とタイトル、説明文です。タイトル・説明文のテキストスタイルはそれぞれアプリケーションで定義したMaterialTheme.typography.subtitle1とbody2をあてています。(フォントサイズやカラーなどは直接記述していませんので適宜読みかえてください)。

完成したカードとElevationを変更した例
@Composable
fun CardContent() {
    Column {
        Image(
            painter = painterResource(R.drawable.image),
            contentDescription = "カード画像",
            modifier = Modifier
                .fillMaxWidth()
                .aspectRatio(ratio = 1.7731f), // 344x194
            alignment = Alignment.Center,
            contentScale = ContentScale.Crop
        )
        Column(Modifier.padding(16.dp)) {
            Text(
                "Title goes here",
                style = MaterialTheme.typography.subtitle1
            )
            Text(
                "Secondary line text techbooster techbooster",
                style = MaterialTheme.typography.body2
            )
        }
    }
}

サンプル用のCardContentコンポーザブルでは画像をクロップし、表示比率をガイドラインに合わせて横344対縦194にしています。表示する画像とテキストは適当に埋めています(ちゃんと実務で使えるコンポーザブル関数にするには表示するデータモデルを引数にして渡してください)。

Cardコンポーザブルの引数

@Composable
fun Card(
    modifier: Modifier = Modifier,
    shape: Shape = MaterialTheme.shapes.medium,
    backgroundColor: Color = MaterialTheme.colors.surface,
    contentColor: Color = contentColorFor(backgroundColor),
    border: BorderStroke? = null,
    elevation: Dp = 1.dp,
    content: @Composable () -> Unit
) {
  • modifier:レイアウトへ反映するmodifier
  • shape:カードの形(と影)を指定
  • backgroundColor:カードの背景色
  • contentColor:コンテンツの標示色
  • border:カード境界線のボーダーの指定
  • elevation:FABを表示するエレベーションの指定
  • content:ボタン表示するコンテンツを提供するコンポーザブル関数

ここまでCardコンポーザブルを紹介しました。カードに対するアクション次第ですが、ひとつだけであればCardコンポーザブル自体をタップ可能にしてしまえば、わかりやすいでしょう。2つ以上のアクション、たとえばカードの中にもお気に入りボタンがあるときはアクションごとにフォーカス(タップした領域の色が変わるなど)するとユーザーがどれを押したかわかりやすいフィードバックになります。

今回の記事はこれでおしまいです。お疲れさまでした。

Add a Comment

Your email address will not be published. Required fields are marked *