0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Material 3 Expressive実装例 : Button

Last updated at Posted at 2025-06-11

Material 3 Expressive の実装例の紹介シリーズです。
今回は Button を紹介します。
(androidx.compose.material3:material3:1.4.0-alpha15 時点での内容になります。)

Material 3 Expressive での変更点

  • スタイルや Shape の多様化
    • デフォルトと toggle
    • Elevated、Filled、Tonal、Outlined、Text のスタイル
    • Round と Square の Shape
    • 押下時の Shape のモーション
    • Extra small、Small、Medium、Large、Extra large のサイズ
  • Button のもつ padding は 24dp ではなく 16dp が推奨されるように変更

実装

押下時の Shape アニメーション

ButtonDefaults.shapes()Buttonshapes に設定します。

Button(
    onClick = {},
    shapes = ButtonDefaults.shapes()
) {
    Text("Button")
}

Round と Square の Shape

Button の shape が未設定もしくは ButtonDefaults.shape を設定すると Round、ButtonDefaults.squareShape を設定すると Square になります。

// Round
Button(
    onClick = {},
) {
    Text("Button")
}

// Square
Button(
    onClick = {},
    shape = ButtonDefaults.squareShape,
) {
    Text("Button")
}

Padding を 16dp に変更

ButtonDefaults.SmallContentPaddingcontentPadding に設定することで使用される 16dp の padding が設定できます。

Button(
    onClick = {},
    contentPadding = ButtonDefaults.SmallContentPadding
) {
    Text("Button")
}

Elevated、Filled、Tonal、Outlined、Text のスタイル

// Elevated
ElevatedButton(
    onClick = {},
) {
    Text("Button")
}

// Filled
Button(
    onClick = {},
) {
    Text("Button")
}

// Tonal
FilledTonalButton(
    onClick = {},
) {
    Text("Button")
}

// Outlined
OutlinedButton(
    onClick = {},
) {
    Text("Button")
}

// Text
TextButton(
    onClick = {},
) {
    Text("Button")
}

Toggle

Text を除くそれぞれのスタイルに対して Toggle button が用意されています。

// Elevated 
ElevatedToggleButton(
    checked = checked,
    onCheckedChange = { checked = it },
) {
    Text("Button")
}

// Filled
ToggleButton(
    checked = checked,
    onCheckedChange = { checked = it },
) {
    Text("Button")
}

// Tonal
TonalToggleButton(
    checked = checked,
    onCheckedChange = { checked = it },
) {
    Text("Button")
}

// Outlined
OutlinedToggleButton(
    checked = checked,
    onCheckedChange = { checked = it },
) {
    Text("Button")
}

(左側が checked = false)

Extra small、Small、Medium、Large、Extra large のサイズ

デフォルトでない Small 以外の Button の高さが標準で用意されており、アイコンのサイズや Padding 等が高さによって自動で適切な値になるように実装する形になります。

// Extra small
val height = ButtonDefaults.ExtraSmallContainerHeight
Button(
    onClick = { },
    modifier = Modifier.heightIn(height),
    contentPadding = ButtonDefaults.contentPaddingFor(height)
) {
    Icon(
        painter = painterResource(R.drawable.ic_edit),
        contentDescription = null,
        modifier = Modifier.size(ButtonDefaults.iconSizeFor(height))
    )
    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(height)))
    Text("Button")
}

// Small(default)
Button(
    onClick = { },
    contentPadding = ButtonDefaults.SmallContentPadding
) {
    Icon(
        painter = painterResource(R.drawable.ic_edit),
        contentDescription = null,
        modifier = Modifier.size(ButtonDefaults.SmallIconSize)
    )
    Spacer(Modifier.size(ButtonDefaults.IconSpacing))
    Text("Button")
}

// Medium
val height = ButtonDefaults.MediumContainerHeight
Button(
    onClick = { },
    modifier = Modifier.heightIn(height),
    contentPadding = ButtonDefaults.contentPaddingFor(height)
) {
    Icon(
        painter = painterResource(R.drawable.ic_edit),
        contentDescription = null,
        modifier = Modifier.size(ButtonDefaults.iconSizeFor(height))
    )
    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(height)))
    Text("Button")
}

// Large
val height = ButtonDefaults.LargeContainerHeight
Button(
    onClick = { },
    modifier = Modifier.heightIn(height),
    contentPadding = ButtonDefaults.contentPaddingFor(height)
) {
    Icon(
        painter = painterResource(R.drawable.ic_edit),
        contentDescription = null,
        modifier = Modifier.size(ButtonDefaults.iconSizeFor(height))
    )
    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(height)))
    Text("Button")
}

// Extra large    
val height = ButtonDefaults.ExtraLargeContainerHeight
Button(
    onClick = { },
    modifier = Modifier.heightIn(height),
    contentPadding = ButtonDefaults.contentPaddingFor(height)
) {
    Icon(
        painter = painterResource(R.drawable.ic_edit),
        contentDescription = null,
        modifier = Modifier.size(ButtonDefaults.iconSizeFor(height))
    )
    Spacer(Modifier.size(ButtonDefaults.iconSpacingFor(height)))
    Text("Button")
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?