A Java library of https://github.com/material-foundation/material-color-utilities
allprojects {
repositories {
maven("https://jitpack.io")
}
}
implementation("com.github.Kyant0:m3color:2024.1")
AppTheme
function in Theme.kt
val keyColor = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
colorResource(id = android.R.color.system_accent1_500)
} else {
Color(0xFF007FAC)
}
MaterialTheme(
colorScheme = dynamicColorScheme(
keyColor = keyColor,
isDark = isSystemInDarkTheme()
),
content = content
)
ThemeExt.kt
import androidx.compose.material3.ColorScheme
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import com.kyant.m3color.dynamiccolor.MaterialDynamicColors
import com.kyant.m3color.hct.Hct
import com.kyant.m3color.scheme.SchemeContent
import com.kyant.m3color.scheme.SchemeExpressive
import com.kyant.m3color.scheme.SchemeFidelity
import com.kyant.m3color.scheme.SchemeFruitSalad
import com.kyant.m3color.scheme.SchemeMonochrome
import com.kyant.m3color.scheme.SchemeNeutral
import com.kyant.m3color.scheme.SchemeRainbow
import com.kyant.m3color.scheme.SchemeTonalSpot
import com.kyant.m3color.scheme.SchemeVibrant
fun dynamicColorScheme(
keyColor: Color,
isDark: Boolean,
style: PaletteStyle = PaletteStyle.TonalSpot,
contrastLevel: Double = 0.0
): ColorScheme {
val hct = Hct.fromInt(keyColor.toArgb())
val colors = MaterialDynamicColors()
val scheme = when (style) {
PaletteStyle.TonalSpot -> SchemeTonalSpot(hct, isDark, contrastLevel)
PaletteStyle.Neutral -> SchemeNeutral(hct, isDark, contrastLevel)
PaletteStyle.Vibrant -> SchemeVibrant(hct, isDark, contrastLevel)
PaletteStyle.Expressive -> SchemeExpressive(hct, isDark, contrastLevel)
PaletteStyle.Rainbow -> SchemeRainbow(hct, isDark, contrastLevel)
PaletteStyle.FruitSalad -> SchemeFruitSalad(hct, isDark, contrastLevel)
PaletteStyle.Monochrome -> SchemeMonochrome(hct, isDark, contrastLevel)
PaletteStyle.Fidelity -> SchemeFidelity(hct, isDark, contrastLevel)
PaletteStyle.Content -> SchemeContent(hct, isDark, contrastLevel)
}
return ColorScheme(
background = Color(colors.background().getArgb(scheme)),
error = Color(colors.error().getArgb(scheme)),
errorContainer = Color(colors.errorContainer().getArgb(scheme)),
inverseOnSurface = Color(colors.inverseOnSurface().getArgb(scheme)),
inversePrimary = Color(colors.inversePrimary().getArgb(scheme)),
inverseSurface = Color(colors.inverseSurface().getArgb(scheme)),
onBackground = Color(colors.onBackground().getArgb(scheme)),
onError = Color(colors.onError().getArgb(scheme)),
onErrorContainer = Color(colors.onErrorContainer().getArgb(scheme)),
onPrimary = Color(colors.onPrimary().getArgb(scheme)),
onPrimaryContainer = Color(colors.onPrimaryContainer().getArgb(scheme)),
onSecondary = Color(colors.onSecondary().getArgb(scheme)),
onSecondaryContainer = Color(colors.onSecondaryContainer().getArgb(scheme)),
onSurface = Color(colors.onSurface().getArgb(scheme)),
onSurfaceVariant = Color(colors.onSurfaceVariant().getArgb(scheme)),
onTertiary = Color(colors.onTertiary().getArgb(scheme)),
onTertiaryContainer = Color(colors.onTertiaryContainer().getArgb(scheme)),
outline = Color(colors.outline().getArgb(scheme)),
outlineVariant = Color(colors.outlineVariant().getArgb(scheme)),
primary = Color(colors.primary().getArgb(scheme)),
primaryContainer = Color(colors.primaryContainer().getArgb(scheme)),
scrim = Color(colors.scrim().getArgb(scheme)),
secondary = Color(colors.secondary().getArgb(scheme)),
secondaryContainer = Color(colors.secondaryContainer().getArgb(scheme)),
surface = Color(colors.surface().getArgb(scheme)),
surfaceTint = Color(colors.surfaceTint().getArgb(scheme)),
surfaceVariant = Color(colors.surfaceVariant().getArgb(scheme)),
tertiary = Color(colors.tertiary().getArgb(scheme)),
tertiaryContainer = Color(colors.tertiaryContainer().getArgb(scheme))
)
}
PaletteStyle.kt
enum class PaletteStyle {
TonalSpot,
Neutral,
Vibrant,
Expressive,
Rainbow,
FruitSalad,
Monochrome,
Fidelity,
Content
}