M3 ExpressiveはComposeで使えるようになった? alpha版の現状と使い方


Jetpack ComposeのM3 Expressive対応は今どうなっていて、使いたい場合はどうすればいいのかを確認しました。 2025年11月末時点の内容です。

利用可能と書いてはあるが・・・

Material design 3の新しい機能セットであるM3 Expressiveが発表されてから半年以上が経過しましたが、2025年11月現在、Jetpack ComposeのM3 Expressiveはまだalpha版です。 Material DesignのWebサイトには “Available” と書かれているのを見て、知らないうちにstableになっていたのかと焦りましたが、Jetpack Composeのライブラリはまだalphaでした。

M3のWebサイトには”Available”と書かれているが・・・

material3 1.5.0のalpha版が必要

Jetpack ComposeでM3 Expressiveを使いたい場合、material3ライブラリの1.5.0を利用する必要があります。 2025年11月末時点の最新版は1.5.0-alpha09です。

build.gradle.kts(:app)
dependencies {
implementation("androidx.compose.material3:material3:1.5.0-alpha09")
}

例として、M3 Expressiveで導入された印象的なクッキー形のShapeを利用してみます。

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun Sample() {
FilledIconButton(
onClick = {},
modifier = Modifier.size(IconButtonDefaults.extraLargeContainerSize()),
shapes = IconButtonShapes(
shape = Cookie7Sided.toShape(),
pressedShape = Ghostish.toShape()
)
) {
Icon(
painter = painterResource(R.drawable.android),
contentDescription = null,
modifier = Modifier.size(IconButtonDefaults.extraLargeIconSize)
)
}
}
クッキー形のボタン
クッキー形のボタン

M3 ExpressiveのAPIにはExperimentalMaterial3ExpressiveApiというアノテーションがついていて、このAPIを利用する側の関数でOptInする必要があります。

ButtonIconButtonのAPIには新しいオーバーライドが追加されています。 引数にshapesを受け取り、ボタンが押されていない場合と押されている場合それぞれのShapeを指定できるようになっています。 この例ではボタンが押されていない場合に7角形(?)のクッキー形のCookie7Sidedを指定し、ボタンが押されている場合にオバケ形(?)のGhostishを指定しています。 また、アイコンのサイズにはextraLargeIconSizeを、ボタンのサイズはextraLargeContainerSizeを指定しています。

material3の1.4.0で使えるようになってなかったっけ?

ところで、M3 Expressiveが発表された頃から注目していた人は、material3の1.4.0で使えるようになっていたのではないかと思うかもしれません。 私もそうでした。

振り返ってみると、M3 Expressiveが発表されたのが2025年の5月頃でした。 その頃のmaterial3ライブラリは1.4.0がalpha版で、M3 ExpressiveのAPIが追加されていたのを覚えています。

material3の1.4.0は2025年の9月にstableになりましたが、いつの間にかM3 ExpressiveのAPIは消えていました。 不思議に思って過去のリリースノートを見てみると、1.4.0-beta01の時点でExperimentalMaterial3ExpressiveApiのついたAPIが全て削除され、同時に1.5.0-alpha01に移動していました。

All public APIs tagged with ExperimentalMaterial3ExpressiveApi or ExperimentalMaterial3ComponentOverrideApi have been removed, please switch to 1.5.0-alpha to continue enjoying these features.

https://developer.android.com/jetpack/androidx/releases/compose-material3#1.4.0-beta01

Google製アプリでは導入が進んでいる

いまだalpha版のM3 Expressiveですが、Google製アプリでは着々と導入が進んでいるようです。 例えばGoogleカレンダーで予定を追加する時に出てくるFAB menuはM3 ExpressiveのFloatingActionButtonMenuを使っていると思われます。

Googleカレンダーの予定追加メニュー
Googleカレンダーの予定追加メニュー

Android 16のPasskey認証中のインジケータにはCircularWavyProgressIndicatorが使われていそうです。

Passkeyの認証中の画面
Passkeyの認証中の画面

alpha版ということで、今後見た目や挙動が変更されるリスクはありますが、影響の少ない部分で導入してみても面白いかもしれません。