1
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実装例 : MaterialExpressiveTheme

Last updated at Posted at 2025-06-11

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

MaterialExpressiveTheme とは

Material 3 Expressive を使う上で Expressive らしさを出すために必要になるのがこの MaterialExpressiveTheme です。

これまでの MaterialTheme との違い

MaterialTheme から MaterialExpressiveTheme に置き換えることで異なる点はデフォルトの MothionScheme が変更される点と、MothionScheme のカスタマイズが可能な点です。
また、MaterialExpressiveThemeデフォルトの ColorScheme も異なるのですが、ほとんどのプロジェクトでは ColorScheme をカスタマイズすることになるのでここでは割愛します。
1.4.0-alpha15 時点では Typography も Expressive 版に置き換える TODO コメントがあるのですが、こちらは変更され次第追記します。

MaterialTheme では MotionScheme#standard が、MaterialExpressiveTheme では MotionScheme#expressive がデフォルトで適用されます。

MotionScheme 説明
standard これまでも適用されていた Linear なアニメーション ezgif-2436d067bb3abe.gif
expressive Expressive らしい Spring なアニメーション ezgif-226363cfbef245.gif

実装

MaterialTheme を使っていた部分を MaterialExpressiveTheme に置き換えるだけになります。

// Before
@Composable
fun AppTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit
) {
    val colorScheme = if (darkTheme) {
        DarkColorScheme
    } else {
        LightColorScheme
    }
    MaterialTheme(
        colorScheme = colorScheme,
        content = content
    )
}

// After
@Composable
fun AppTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit
) {
    val colorScheme = if (darkTheme) {
        DarkColorScheme
    } else {
        LightColorScheme
    }
    MaterialExpressiveTheme(
        colorScheme = colorScheme,
        content = content
    )
}

MotionScheme は独自でカスタマイズしたものを設定することも、MotionScheme#standard を適用することも可能です。
()

MaterialExpressiveTheme(
    motionScheme = MotionScheme.standard(),
    content = content
)

また、MaterialExpressiveTheme はこれまでの MaterialTheme と共存可能で、部分的に特定スコープ内で MaterialExpressiveTheme を適用することも可能です。

@Composable
fun Screen() {
    ...
    MaterialExpressiveTheme(
        colorScheme = MaterialTheme.colorScheme,
    ) {
        var isChecked by remember { mutableStateOf(false) }
        Switch(
            checked = isChecked,
            onCheckedChange = { isChecked = it }
        )
    }
}
1
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
1
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?