Skip to content
Stipple
Esc
↑↓navigate↵open⌘Jpreview
On this page

Getting started

Add Stipple to a Compose Multiplatform project and draw a first dither.

Install

Stipple publishes two artifacts to Maven Central. Add the engine, and the components if you want them.

kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation("io.github.jantursky:stipple:1.1.2")
            implementation("io.github.jantursky:stipple-components:1.1.2")
        }
    }
}

The engine needs Compose runtime, foundation, UI and animation. Android needs minSdk 23.

A first dither

Modifier.dither fills an element with a field, behind its content.

Box(
    Modifier
        .size(240.dp)
        .dither(DitherFields.radial(), DitherPatterns.Bayer4),
)

The radial field is dense in the middle and thins out towards the edge. Switch the pattern to DitherPatterns.BlueNoise and the same tones come out grainy instead of regular.

Animate it

Dithers are static by default. Pass animated = true and a field that uses time:

Box(
    Modifier
        .fillMaxWidth()
        .height(200.dp)
        .dither(DitherFields.waves(), animated = true, stillTime = 1f),
)

stillTime is the moment shown when animation is off, and the moment a reduced-motion user sees. Pick a frame that looks finished.

Use a component

DitherProgressBar(progress = 0.6f, contentDescription = "Upload progress")

Components read the theme from the composition, so a call site rarely needs one. Provide it once:

ProvideStippleTheme(StippleTheme.Light.copy(cell = 2.dp)) {
    App()
}

ProvideStippleTheme() with no argument follows the system’s light or dark mode.

The gallery shows every page with its source next to it, and controls for the pattern, cell size and colours. Run it from the repository:

./gradlew :samples:desktop:run                      # desktop
./gradlew :samples:web:wasmJsBrowserDevelopmentRun  # browser
./gradlew :samples:androidApp:installDebug          # Android device or emulator

The iOS app is in samples/iosApp; generate its Xcode project with xcodegen and run it on a simulator.

Was this page helpful?