😺
JetpackCompose MDC Compose Theme Adapterでデザインシステムを作成する
前回の記事でJetpackComposeでデザインシステムを構築するというのをやりましたが、
フルスクラッチしなくとも公式が提供しているライブラリで簡単に
デザインシステムを作成することができるので、
今回はそちらを紹介していきます。
MDC Compose Theme Adapterとは
元々androidでよく使われているデザインテーマがMaterialComponentsなので
恐らくMaterial(Design)Componentsからの
MDCだと思います(多分)
つまりは従来から使用しているTheme.MaterialComponentsを流用して
そのままComposeでも使うことができるというライブラリです。
AppCompatテーマを使っている方は
AppCompat Compose Theme Adapter
という同様のものがあるのでそちらを利用しましょう。
サンプルコード
@Composable
fun CustomTheme(
content: @Composable () -> Unit,
) {
val context = LocalContext.current
val layoutDirection = LocalLayoutDirection.current
val (colors, type, shapes) = createMdcTheme(
context = context,
layoutDirection = layoutDirection
)
MaterialTheme(
colors = colors
?: throw IllegalArgumentException("Colors were not imported from MDC theme"),
typography = type
?: throw IllegalArgumentException("Typography was not imported from MDC theme"),
shapes = shapes
?: throw IllegalArgumentException("Shapes were not imported from MDC theme"),
content = content
)
}
object CustomTheme {
val colors
@Composable
@ReadOnlyComposable
get() = MaterialTheme.colors
val typography
@Composable
@ReadOnlyComposable
get() = MaterialTheme.typography
val shapes
@Composable
@ReadOnlyComposable
get() = MaterialTheme.shapes
}
解説
雑にいうとベースとなるTheme.MaterialComponentsから情報を引っ張って
ComposeのMaterialThemeのcolor等を上書きしている感じです。
なのでマテリアルテーマで初めから定義されている
primaryColor等しか引き継ぐことはできません
カスタム属性を追加したい場合
そういう場合はライブラリではサポートされていないので、
kotlinの拡張機能を使って
MaterialTheme.Colors等を拡張することで対応することできます。
val Colors.brand_color
get() = Color(0xFFEE8122)
val Typography.appBar
@Composable
@ReadOnlyComposable
get() = TextStyle(
fontWeight = FontWeight.Bold,
fontSize = 16.sp,
textAlign = TextAlign.Center,
letterSpacing = 0.5.sp
)
というような感じ。
この際にMaterialThemeから引っ張ってくると
直感的に違和感を感じるためにobject CustomTheme{}
とすることでCustomThemeから引っ張ることができるようにしていますが、
ここについては好みかと思います。
参考記事
Discussion
MDC-Android Compose Theme Adapterの説明について、語弊があるように思えたのでコメントさせてください。
前提として、MDCというのはMaterial Design ComponentをAndroidで利用しやすくするためのサポートライブラリとなります。AndroidはMaterial Designの使用を推奨していますが、Material DesignはAndroidとは別に発展しているため、MDCは外部ライブラリという形で提供されています。
Compose以前ではMaterialDesignのカラーパレットを
color.xml
に定義することでMDCに反映させることができましたが、Composeではテーマをコードで記述する必要があります。Composeと従来のViewが混在している場合に、多重管理になるなどの問題があるので、そこで従来の
color.xml
の定義を参照して、MDC向けのテーマを作成してくれる便利ツールとしてMDC-Android Compose Theme Adapterが存在するという感じになります。詳しい解説ありがとうございます!!!