Talk about Material 3 given at GDG 2023, AppDevCon NL 2023, droidcon Berlin 2023, droidcon NYC 2023 and droidcon Lisbon 2023
By Odin Asbjørnsen & Fatih Giris
Getting your appsready for Material 3Odin AsbjørnsenAndroid Developer @ DNBFatih GirisAndroid Lead @ DNB
View Slide
What this talk is
What this talk isA guide to start using or adopting Material 3
What this talk is not
What this talk is notA complete documentation and guide for Material 3
Agenda• Colors• Typography• Major components• Material 2 to Material 3• Material 3 at DNB• Take-aways & learnings
Colors
Colors• Key colors• Accent• Neutral
Key colorshttps://m3.material.io/styles/color/the-color-system/key-colors-tones
Colors• Key colors• Accent• Neutral• Additional colors• Error• Product specific
Additional colorshttps://m3.material.io/styles/color/the-color-system/key-colors-tones
Tonal palettes
Tonal palettes1 color 13 tones
Tonal paletteshttps://m3.material.io/styles/color/the-color-system/key-colors-tones
Why tonal palettes?
Why tonal palettes?• Establish context in the visual hierarchy
Primary color’s tone usage in different componentsWhy tonal palettes?
Different surface tones in M3Surface tones
Surface tonesNavigation barElevated card
Why tonal palettes?• Establish context in the visual hierarchy• Establish various level of meaning with the same color
Outlined button statesWhy tonal palettes?
Why tonal palettes?• Establish context in the visual hierarchy• Establish various level of meaning with the same color• Accessible contrast ratios
https://m3.material.io/styles/color/the-color-system/accessibilityWhy tonal palettes?
How to generate tonal palettes?🤔
https://m3.material.io/theme-builder
Colorshttps://m3.material.io/styles/color/the-color-system/color-roles
M3 Colors in ComposeMaterialTheme.kt@Composablefun MaterialTheme(colorScheme: ColorScheme = MaterialTheme.colorScheme,shapes: Shapes = MaterialTheme.shapes,typography: Typography = MaterialTheme.typography,content: @Composable () -> Unit) {
class ColorScheme(primary: Color,onPrimary: Color,primaryContainer: Color,onPrimaryContainer: Color,inversePrimary: Color,secondary: Color,onSecondary: Color,secondaryContainer: Color,onSecondaryContainer: Color,tertiary: Color,onTertiary: Color,tertiaryContainer: Color,onTertiaryContainer: Color,M3 Colors in ComposeColorScheme.kt
secondaryContainer: Color,onSecondaryContainer: Color,tertiary: Color,onTertiary: Color,tertiaryContainer: Color,onTertiaryContainer: Color,background: Color,onBackground: Color,surface: Color,onSurface: Color,surfaceVariant: Color,onSurfaceVariant: Color,surfaceTint: Color,inverseSurface: Color,inverseOnSurface: Color,error: Color,onError: Color,errorContainer: Color,onErrorContainer: Color,M3 Colors in ComposeColorScheme.kt
onSurfaceVariant: Color,surfaceTint: Color,inverseSurface: Color,inverseOnSurface: Color,error: Color,onError: Color,errorContainer: Color,onErrorContainer: Color,outline: Color,outlineVariant: Color,scrim: Color,) {M3 Colors in ComposeColorScheme.kt
M3 Colors in XMLtheme.xml<br/>…<br/>
M3 Colors in XMLtheme.xml<br/><item name="colorPrimary"></item><br/><item name="colorOnPrimary"></item><br/><item name="colorPrimaryInverse"></item><br/><item name="colorPrimaryContainer"></item><br/><item name="colorOnPrimaryContainer"></item><br/><item name="colorSecondary"></item><br/><item name="colorOnSecondary"></item><br/><item name="colorSecondaryContainer"></item><br/><item name="colorOnSecondaryContainer"></item><br/><item name="colorTertiary"></item><br/><item name="colorOnTertiary"></item><br/><item name="colorTertiaryContainer"></item><br/><item name="colorOnTertiaryContainer"></item><br/><item name="android:colorBackground"></item><br/><item name="colorOnBackground"></item><br/><item name="colorSurface"></item><br/><item name="colorOnSurface"></item><br/><item name="colorSurfaceVariant"></item><br/><item name="colorOnSurfaceVariant"></item><br/>
M3 Colors in XMLtheme.xml
28color attributes🤯
Which color attribute affectswhich component?
https://github.com/oas004/Material3Playground
Typography
Typography• 5 roles
Typography• 5 roles• Display https://m3.material.io/styles/typography/applying-type
Typography• 5 roles• Display• Headline https://m3.material.io/styles/typography/applying-type
Typography• 5 roles• Display• Headline• Title https://m3.material.io/styles/typography/applying-type
Typography• 5 roles• Display• Headline• Title• Body https://m3.material.io/styles/typography/applying-type
Typography• 5 roles• Display• Headline• Title• Body• Labelhttps://m3.material.io/styles/typography/applying-type
Major Components
Top App Bars• Provide content and actions• Support for dynamic colors• No drop shadow
Top App Bars• 4 types• Center-aligned• Small• Medium• Large
Cards• 3 types• Outlined Card• Elevated Card• Filled Card
Switch• More accessible• New color mapping meets nontext contrast requirements• Optional icon on the thumb• Taller and wider layout track
SwitchM2 M3
Switch
Navigation Bar• New color mapping• No shadow• Pill shape as an active indicator• Taller height in M3
Navigation Bar• 3 - 5 destinations with and without label text• Provide short and meaningful label texts
• 3 - 5 destinations with and without label text• Provide short and meaningful label texts• Optional badgeNavigation Bar
Chips• Represent options in a specific context• 4 different types
ChipsM2 M3
Buttonshttps://m3.material.io/components/all-buttons
Material 2 to Material 3
Material 2 to Material 3• When should you migrate?• As soon as possiblehttps://developer.android.com/jetpack/compose/designsystems/material2-material3
Material 2 to Material 3 (Compose)• Phased approach for Compose1. Add M3 dependency alongside M2 dependency2. Add M3 version of your app’s theme alongside M2 versionof your app’s theme.3. Migrate individual modules, screens, (or composables) toM3.4. Once fully migrated, remove M2 from the app.PhasedApproach
Material 2 to Material 3 (View)Non-phasedapproachPhasedApproach
Material 2 to Material 3 (View)1. Replace the MaterialComponents with Material 3 in yourparent theme2. Handle breaking changes for components (Chips,BottomNavigation, etc)3. Configure your app themeNon-phasedapproach
Material 2 to Material 3 (View)1. Change the style of each component separately to M32. Configure app themePhasedApproach
Material 3 at DNB
Material 3 at DNB• Custom design system called Eufemia
Design System at DNBwww.eufemia.dnb.no
Design System at DNBEufemiaAndroiduse MaterialComponents
Design System at DNBEufemiaAndroiduse MaterialComponentsApp1App2
Design System at DNBEufemiaAndroid(View)EufemiaAndroid(Compose)useMaterialComponents(View)useMaterialComponents(Compose)EufemiaAndroid
How to start using M3?
Material 3 at DNBEufemiaAndroid(View)EufemiaAndroid(Compose)useM2Components(View)useM2Components(Compose)EufemiaAndroid
Material 3 at DNBEufemiaAndroid(View)EufemiaAndroiduseM2Components(View)useM2Componentsfemiadroid
Material 3 at DNBEufemiaAndroid(View)EufemiaAndroiduseM3Components(View)useM2Componentsfemiadroid
Material 3 at DNBtheme.xml<br/>
Material 3 at DNBtheme.xml<br/><item name="colorPrimary"></item><br/><item name="colorOnPrimary"></item><br/><item name="colorPrimaryInverse"></item><br/><item name="colorPrimaryContainer"></item><br/><item name="colorOnPrimaryContainer"></item><br/><item name="colorSecondary"></item><br/><item name="colorOnSecondary"></item><br/><item name="colorSecondaryContainer"></item><br/><item name="colorOnSecondaryContainer"></item><br/><item name="colorTertiary"></item><br/><item name="colorOnTertiary"></item><br/><item name="colorTertiaryContainer"></item><br/><item name="colorOnTertiaryContainer"></item><br/><item name="android:colorBackground"></item><br/><item name="colorOnBackground"></item><br/><item name="colorSurface"></item><br/><item name="colorOnSurface"></item><br/><item name="colorSurfaceVariant"></item><br/>
But waitAll components are M3 …
How to do a phased migration?
Material 3 at DNBstyles.xml<br/>…<br/>
Material 3 at DNBEufemiaChip.ktpublic class EufemiaChip : Chip {public constructor(context: Context) : super(ContextThemeWrapper(context,R.style.Widget_Eufemia_Chip))... }
Material 3 at DNBEufemiaAndroid(View)EufemiaAndroid(Compose)useM2 + M3Components(View)useM2Components(Compose)EufemiaAndroid
Material 3 at DNBEufemiaAndroid(View)EufemiaAndroid(Compose)useM2 + M3Components(View)useM2 + M3Components(Compose)EufemiaAndroid
Material 3 at DNBMaterial3Theme(colorScheme = getMaterial3ColorScheme(),typography = provideM3Typography(),) {}Theme.kt
Material 3 at DNBTheme.ktMaterial3Theme(colorScheme = getMaterial3ColorScheme(),typography = provideM3Typography(),) {Material2Theme(colors = getMaterialColors(),typography = provideM2Typography(),content = content)}
Material 3 at DNBEufemiaAndroiduse MaterialComponentsApp1App2
Takeaways & learnings
Takeaways & learnings• Color• Talk with the designersfirst• Lots of color attributes• Tonal palette
Takeaways & learnings• Components• Navigation bar, buttons, chips, switches visually different• Better to do phased migration• Screenshot tests for all components
THANKS ♥
QUESTIONS@oas004@fatih_grs