Zygote
UI toolkitsintermediate

Design languages

Five visual languages in eighteen years: pre-Holo, Holo, Material, Material You and Material 3 Expressive. Each one was an answer to a specific failure of the last.

11 minAPI 1–37 · 17interactivequizverified 2026-10-27

Android's design language is not decoration. Each era solved a concrete problem: inconsistency across OEMs, a lack of visual hierarchy, a lack of personalisation, and now a lack of adaptability across phones, foldables, tablets and desktops.

TL;DR#

  • Pre-Holo (2008–2011): default widgets, dense lists, no shared language across apps.
  • Holo (2011–2014): one dark, blue-accented system; the first time apps looked related.
  • Material (2014–2021): surfaces, elevation, motion and a design specification, not just a theme.
  • Material You (2021–2025): dynamic colour from the wallpaper, large radii, personalisation.
  • Expressive (2025–): bolder shapes, springier motion, higher contrast, adaptive by default.

Mental model#

Think of a house style guide for a large organisation.

Early Android had none: every department chose its own letterhead. Holo was the first guide — one font, one accent, one dark surface. Material added a physical metaphor: paper, ink, elevation, and rules for how things move. Material You let the guide adapt its colours to the reader. Expressive made the guide louder and more confident.

Where the analogy breaks#

A style guide is advisory. Android's design language is enforced through the toolkit: the widgets you get from TextInputLayout or MaterialTheme have the current defaults baked in. That is why a design era is visible in an app nobody redesigned — the components changed under it.

The big picture#

Loading diagram…
Text description of this diagram

The same settings screen drawn five times. The pre-Holo version is a dense dark list with thin dividers and a black title bar, no accent colour. Holo adds a dark surface with a blue accent, a fixed action bar and a blue slider. Material is a light surface with white cards, subtle elevation, a blue primary colour and a floating action button. Material You uses a warm dynamic palette derived from a wallpaper, pill-shaped rows, large corner radii and generous spacing. Material 3 Expressive uses bolder type, pill-shaped segmented controls, larger touch targets and stronger contrast. The information in every version is identical; only type, shape, colour, density and motion differ.

Look at the density: pre-Holo fits six rows, Expressive fits three. That is not a regression — touch targets grew as phones moved from stylus to finger, and accessibility guidance raised the minimum size.

Deep dive#

Pre-Holo: no system at all#

Android 1.0 through 2.3 shipped a set of default widgets and no shared design vocabulary. Apps used the platform defaults or replaced them entirely, and the result was that two apps on the same phone looked like they came from different companies — because they did.

The visual signature: dense lists with hairline dividers, a black title bar, no accent colour, and gradients used decoratively.

Holo: one system, and a backlash#

Android 3.0 (Honeycomb, tablets) introduced Holo, and 4.0 brought it to phones. It was the first deliberate design system: a dark Holo theme with a single blue accent, a fixed action bar, and a consistent set of widget appearances.1

Holo solved consistency. It created two problems. First, it was dark by default, which made outdoor readability poor. Second, it was rigid: because it shipped in the platform, an app could only look "Holo" at the version the device ran. Apps that wanted a consistent look across versions had to reimplement the widgets — which is where the Support Library's design libraries came from.

Material: a specification, in a library#

Material Design arrived in Android 5.0 with three ideas that are still visible:

  1. Surfaces with elevation. A card is a sheet of paper with a shadow; the shadow encodes hierarchy.
  2. Motion with meaning. Transitions explain where things came from, rather than decorating.
  3. A design document, not just a theme. Material was published as a specification anyone could implement.

The architectural consequence was more important than the visuals: Material shipped as com.google.android.material:material, a library, so an app could look the same on Android 5 and Android 14. That decision is the reason the design language stopped being tied to the OS version.

Material also introduced the floating action button, the navigation drawer pattern, and the TextInputLayout with a floating label.

Material You: colour from the user#

Android 12 introduced dynamic colour: the system derives a palette from the user's wallpaper and exposes it as a set of tonal values. Apps that opt in inherit it.

@Composable
fun NotesTheme(
    dynamicColor: Boolean = true,
    content: @Composable () -> Unit,
) {
    val colorScheme = when {
        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
            val context = LocalContext.current
            if (isSystemInDarkTheme()) dynamicDarkColorScheme(context)
            else dynamicLightColorScheme(context)
        }
        isSystemInDarkTheme() -> darkColorScheme()
        else -> lightColorScheme()
    }
 
    MaterialTheme(
        colorScheme = colorScheme,
        typography = NotesTypography,
        content = content,
    )
}

The visual signature of Material You: large corner radii, generous padding, pill-shaped controls, tonal surfaces instead of white cards, and a type scale with a strong display size.2

Material 3 Expressive: louder, springier, more adaptive#

2025's Material 3 Expressive is the current era, and it has two distinct halves.

The expressive half is visual: bolder shapes, pill-shaped segmented controls, springy motion, higher contrast ratios, and a type scale with more range. It is a reaction to the flatness that Material You's tonal surfaces produced.

The adaptive half is structural, and it matters more. Android 16 brought desktop windowing to tablets and continued the edge-to-edge push; Android 17 goes further, making apps adaptive-first: on large screens, orientation and resizability restrictions are ignored.3

// Window size classes, not device categories.
@Composable
fun NotesApp(windowSizeClass: WindowSizeClass) {
    when (windowSizeClass.widthSizeClass) {
        WindowWidthSizeClass.Compact -> NotesSinglePane()
        WindowWidthSizeClass.Medium -> NotesTwoPane()
        else -> NotesThreePane()
    }
}

The reason is simple: a phone, a foldable unfolded, a tablet in split screen and a desktop window are all "large screens" at different times. Designing for a device category cannot express that; designing for a size class can.

Type, shape and motion as APIs#

Each era is a set of decisions that turn into parameters:

EraCorner radiusType scaleMotion
Holosquare (0 dp)two sizeslinear, short
Material2 dp on cardsfive rolesstandard easing curves
Material You16–28 dpfive roles, larger displayemphasised easing
Expressivepills and 28 dp+more range, bolder weightsspring physics

Those numbers are not aesthetic trivia. A component library exposes them as tokens — shape, typography, motionScheme — and an app that hard-codes a radius is an app that will look wrong after the next design refresh.

// Read the shape from the theme, not from a literal.
Surface(
    shape = MaterialTheme.shapes.large,
    tonalElevation = 1.dp,
) { /* … */ }

Dark theme is a design constraint, not a toggle#

A palette that works in light mode often fails in dark mode: pure white text on pure black is harsh, and shadows disappear. Material's tonal palettes exist to make both modes derive from the same source colour, so contrast is preserved rather than hand-tuned.

The design language is in the code#

Each era changed APIs, not just pixels:

EraAPI signature
pre-Holoplatform widgets, no theme system
Holoandroid:Theme.Holo, action bar
MaterialTheme.MaterialComponents, FloatingActionButton, TextInputLayout
Material YouDynamicColors.applyToActivitiesIfAvailable, tonal palettes
ExpressiveMaterialExpressiveTheme, MotionScheme, window size classes

That is why a "design" page belongs in an internals site: the design language is delivered as libraries, theme attributes and composables, and it changes what your code must do.

Adaptive icons and the launcher#

An adaptive icon separates the foreground from the background, and the launcher applies a mask. That is how one icon asset works on a round-icon launcher, a squircle launcher and a themed-icon launcher.

<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@color/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
    <monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon>

The monochrome layer is what enables themed icons in Material You: the launcher recolours it to match the system palette.5

Splash screens became an API#

Before Android 12, every app implemented its own launch screen, usually badly — a windowBackground that flashed, or an activity that delayed the real one. Android 12 introduced a system splash screen API that shows the app icon and then hands off to the app.2

That is a design decision expressed as a platform API: the system now owns the first impression, because a consistent launch experience across apps was worth more than per-app control.

Predictive back changes the visual vocabulary#

Predictive back shows the destination during the gesture — a scaled-down preview of the previous screen. It is a design change (motion communicates the destination) enabled by a platform change (the system can query the back stack ahead of time).6

It also constrains design: an app that cannot describe its back destination in advance cannot participate in the animation.

How it evolved#

Interface changes16 releases
APIVersionWhat changed
11.0
  • Pull-down notification shade
  • Home screen with widgets
31.5 Cupcake
  • Home screen widgets and folders
92.3 Gingerbread
  • New UI with dark theme and green accents
113.0 Honeycomb
  • The Holo design language arrives
123.1 Honeycomb
  • Resizable widgets
164.1 Jelly Bean
  • Project Butter: vsync-driven, smooth UI
  • Expandable notifications
204.4W KitKat (Wear)
  • Voice-driven card UI
215.0 Lollipop
  • Material Design
  • Notifications on the lock screen
247.0 Nougat
  • Quick Settings tiles
  • Direct Reply in notifications
268.0 Oreo
  • Notification channels
289 Pie
  • Dark theme groundwork
2910
  • System-wide dark theme
3011
  • Conversation notifications and bubbles
  • Media controls in Quick Settings
3112
  • Material You dynamic colour
3313 Tiramisu
  • Themed app icons
  • Runtime notification permission
3616 Baklava
  • Material 3 Expressive
  • Live Updates notifications

Five eras in eighteen years, roughly one every four. The pattern: each era is a correction of the previous one's excess — Holo's darkness, Material's flatness, You's softness, and now Expressive's boldness, with adaptiveness as the constant direction.

Under the hood#

Curiosity corner#

  • Holo's blue was chosen to be visible on OLED and LCD. It was a practical decision about display technology as much as an aesthetic one.
  • The Material Design specification is a public document that other platforms have borrowed from, which is why Material-influenced UI shows up in web and desktop apps.
  • Dynamic colour samples the wallpaper, not the app icon. The palette comes from the system's wallpaper analysis, which is why two apps with completely different brands share a tonal scheme.

Try it#

See the current theme attributes of an app

adb shell dumpsys activity top | grep -i theme

Check the device's UI mode and density

adb shell dumpsys display | grep -E "mBaseDisplayInfo|density"

Check yourself#

Check yourself

1 / 12

What is the difference between `invalidate()` and `requestLayout()`?

0 answered · 0 correct

Sources#

Sources

Every version number, API level, class name and date on this page is traced to one of these. Pages are re-verified against them; last_verified above says when.

  1. docsAndroid releases and versionsdeveloper.android.comaccessed 2026-10-27↩
  2. docsFeatures and APIs overview | Android 12developer.android.comaccessed 2026-10-27↩
  3. docsBehavior changes: Apps targeting Android 17developer.android.comaccessed 2026-10-27↩
  4. docsDisplay content edge-to-edgedeveloper.android.comaccessed 2026-10-27↩
  5. docsAdaptive iconsdeveloper.android.comaccessed 2026-10-27↩
  6. docsBehavior changes: Apps targeting Android 16 or higherdeveloper.android.comaccessed 2026-10-27↩
  7. docsMaterial Designm3.material.ioaccessed 2026-10-27↩
  8. docsMaterial Designmaterial.ioaccessed 2026-10-27↩
  9. docsBehavior changes: Apps targeting Android 13 or higherdeveloper.android.comaccessed 2026-10-27↩
  10. blogAndroid 17 is hereAndroid Developers Blogaccessed 2026-10-27↩