Produktneuigkeiten

Neuerungen im Jetpack Compose-Release vom August 2026

Lesezeit: 5 Minuten
Profil von Nick Butcher ansehen
Nick Butcher Product Manager

Das Release von Jetpack Compose für August 2026 ist jetzt stabil. Mit dieser Version wird Version 1.12 für die wichtigsten Compose-Module eingeführt (siehe die vollständige BOM-Zuordnung). Sie bietet umfangreiche visuelle APIs wie Mesh-Verläufe und Unterstützung für Wide Color Gamut (WCG), strukturelle Layoutfunktionen wie benannte Bereiche in Grid, eine nahtlose Integration mit dem Credential Manager von Android sowie erhebliche Verbesserungen bei Tests und Leistung.

Wenn Sie Ihr Projekt auf die aktuelle Version aktualisieren möchten, aktualisieren Sie die Version Ihrer Compose-BOM auf 2026.08.00:

implementation(platform("androidx.compose:compose-bom:2026.08.00"))

Aktuelle Änderungen

  • AGP und Compile SDK: Mit Compose 1.12 wird das Compile SDK auf API 37 aktualisiert. Dafür ist mindestens AGP 9.1.2 erforderlich. Zur Erinnerung: Compose ist immer auf das neueste compileSdk ausgerichtet. Weitere Informationen zu dieser Änderung
  • Modifier.onFirstVisible() ist veraltet: Migrieren Sie zu Modifier.onVisibilityChanged(), das eine genauere Erfassung von Sichtbarkeitsschwellen ermöglicht.

Grafik

Mesh-Verläufe

Mit Compose 1.12 wird MeshGradientPainter eingeführt, mit dem Sie organische Farbverläufe mit mehreren Punkten erstellen können.

meshGradient.gif
val rows = 1
val columns = 1

val gradientPainter = remember {
    MeshGradientPainter(rows, columns) {
        // Parameters: row, column, position, color
        setVertex(0, 0, Offset(0f, 0f), Color.Red)     // Top-Left
        setVertex(0, 1, Offset(1f, 0f), Color.Blue)    // Top-Right
        setVertex(1, 0, Offset(0f, 1f), Color.Green)   // Bottom-Left
        setVertex(1, 1, Offset(1f, 1f), Color.Yellow)  // Bottom-Right
    }
}

Box(
    modifier = modifier
        .aspectRatio(16/9f)
        .fillMaxWidth()
        .paint(gradientPainter)
)

Weitere Informationen und Beispiele finden Sie in der Dokumentation.

Unterstützung von Wide Color Gamut und HDR

Moderne Displays bieten eine erweiterte Farbtreue und einen höheren Dynamikbereich. In Compose 1.12 wurde die vollständige Pipelineunterstützung für Wide Color Gamut (P3) und HDR-Rendering für Compose-Grafiken, -Farben und -Shader aktiviert. Farben, die in Nicht-sRGB-Farbräumen (z. B. Display P3) definiert sind, werden bei der Darstellung auf der Plattform ohne Farb-Clamping beibehalten. Farben werden sicher auf sRGB zurückgesetzt, wenn sie einen nicht unterstützten Farbraum verwenden (z. B. CieXyz, CieLab oder Oklab), auf einen Farbraum auf einer nicht unterstützten Android-Version basieren (z. B. Bt2020Hlg auf Android 13 und niedriger) oder wenn die App unter Android 9 (API 28) und niedriger ausgeführt wird.

Weitere wichtige Änderungen:

  • LayerOutsets wurde zu GraphicsLayer und Modifier.graphicsLayer hinzugefügt. Damit können Sie die visuellen Grenzen der Ebene über ihre gemessene Größe hinaus erweitern. Wenden Sie LayerOutsets an, um das implizite clipToBounds-Verhalten zu vermeiden, wenn die Ebene in einen Offscreen-Puffer verschoben wird.

Stile

Auf der Google I/O haben wir unsere erste Vision für die Compose Styles API vorgestellt – eine einheitliche, leistungsstarke Möglichkeit, Komponenten zu gestalten. Seitdem haben wir die zugrunde liegende Architektur weiterentwickelt, um strenge Typsicherheit und vorhersehbare Korrektheit zu gewährleisten und die Entwicklung benutzerdefinierter Designsysteme zu unterstützen. 

Damit wir diese grundlegende Ebene richtig gestalten können, bleibt die API experimentell und es kann zu grundlegenden Änderungen kommen. 

Laufzeitoptimierungen

Keyed SideEffect Overload

SideEffect unterstützt jetzt Schlüsselargumente. So können Sie einmalige Nebeneffekte auslösen, wenn sich bestimmte Schlüssel ändern. Das kann zu einer besseren Leistung führen als die Verwendung von LaunchedEffect oder DisposableEffect , wenn Sie den Coroutine- oder Dispose-Block nicht benötigen. SideEffect ist bis zu 90% schneller als LaunchedEffect und etwa 20% schneller als DisposableEffect. SideEffect wird vor DisposableEffect und LaunchedEffect ausgeführt. Seien Sie also vorsichtig, wenn Sie vorhandene Effekte zu dieser API migrieren, insbesondere für LaunchedEffects, die erst nach Abschluss des aktuellen Frames ausgeführt werden sollen. 

@Composable
fun AnalyticsTracker(userId: String, screenName: String) {
    SideEffect(key1 = userId, key2 = screenName) {
        analytics.logScreenView(userId, screenName)
    }
}

Animation

Interaktive zweistufige Übergänge

  • Neue Composables: Mit DeferredAnimatedContent und DeferredAnimatedVisibility lassen sich ansprechende zweistufige Übergänge erstellen, z.B. für das Tracking von Vorhersage-Gesten.
  • Manuelle Animationssteuerung: Während der verzögerten Phase einer Übergangsanimation können animierte Eigenschaften (z. B. Skalierung oder Offset) jetzt manuell in Echtzeit bearbeitet werden (z. B. durch Verfolgen einer Wischbewegung).
  • Nahtlose Übergabe: Wenn die verzögerte Phase endet, übernimmt die Übergangs-Engine und führt eine nahtlose Übergabe durch, einschließlich der Geschwindigkeitsübertragung, zur automatischen Umstellung.
  • Unterstützung für gemeinsame Elemente: Mit dem neuen Flag permitTransformDuringDeferredTransition in SharedContentConfig wird gesteuert, ob sich gemeinsame Elemente während der verzögerten Übergangsphase visuell zusammen mit ihren übergeordneten Containern transformieren.
val state = remember { DeferredTransitionState(initialScreen) }
val transition = rememberDeferredTransition(state)

if (predictiveBackInProgress) {
    state.defer(targetScreen)
} else {
    state.animateTo(targetScreen)
}

transition.DeferredAnimatedContent(
    targetState = targetScreen,
    mutableTransformSpec = {
       MutableContentTransform {
           // Manually manipulate properties during the deferred phase
           initialContentTransform { scale = swipeProgress }
       }
    }
) { screen ->
    ScreenContent(screen)
}

Im Folgenden finden Sie zwei Demos von Anwendungsfällen, in denen eine durch eine Geste ausgelöste Animation an eine getriggerte Animation übergeben wird:

colorCards.gif

Text-, Eingabe- und Plattformintegrationen

Bearbeitbare Textformatierung

Neue APIs bieten Rich-Text-Formatierung für bearbeitbaren Text in BasicTextField. Sie können jetzt mit SpanStyle und ParagraphStyle über die neue Methode addStyle() in einem TextFieldBuffer-Bereich (z. B. in textFieldState.edit { ... } oder InputTransformation) Inline-Zeichen- und Absatzformatierungen programmatisch anwenden und bearbeiten. Außerdem bietet TextFieldBuffer die APIs getSpanStyles() und getParagraphStyles(), die TrackedRange-Objekte zurückgeben. So können Sie angewendete Formatierungen lesen, aktualisieren oder entfernen. Zur Ergänzung der Formatierungserstellung wird in TextFieldState jetzt eine schreibgeschützte textStyles-Eigenschaft zum Abfragen aktiver Formatierungen in Bereichen bereitgestellt. Mit TextFieldBuffer können Sie mit originalTextStyles den Formatierungsstatus vor einer Bearbeitung prüfen. Textformatierung und benutzerdefinierte Anmerkungen bleiben bei Konfigurationsänderungen erhalten.

val state = rememberTextFieldState("Formatted text in Compose 1.12")

// Apply bold and color styles to a range of text
state.edit {
    addStyle(
        SpanStyle(fontWeight = FontWeight.Bold, color = Color.Blue),
        start = 0,
        end = 9
    )
}

// Query active styles from TextFieldState
val currentStyles = state.textStyles

Textauswahl

Eine neue SelectionState API bietet programmatische Steuerung und Beobachtbarkeit der Textauswahl in einem SelectionContainer. Wenn Sie ein SelectionState-Objekt über rememberSelectionState() bereitstellen und an SelectionContainer übergeben, wird selectedTexts als reaktive Liste von AnnotatedStrings verfügbar gemacht und es werden Methoden wie selectAll(), clear(), select(TextRange) und extendSelectionByWord() bereitgestellt.

Außerdem können Sie mit getSelectableTexts() alle auswählbaren Textelemente in der Layoutreihenfolge abrufen und mit einem globalen Bereich Text über Composables hinweg in SelectionContainer auswählen. 

@Composable
fun ProgrammaticSelectionExample() {
    val selectionState = rememberSelectionState()

    Column {
        Button(
            onClick = { selectionState.selectAll() },
            modifier = Modifier.disableSelectionClearOnTap()
        ) {
            Text("Select All")
        }

        SelectionContainer(state = selectionState) {
            Text("Text content to be selected programmatically.")
        }
    }
}

Credential Manager-Integration

Compose-Textfelder sind jetzt nativ in den Credential Manager von Android (API 34+) über das Autofill-Framework integriert (unter API 34 wird androidx.credentials library verwendet). Wenn Sie die neue Semantikeigenschaft credentialRequest mit CredentialRequestData anhängen, können für Texteingaben Passkeys, gespeicherte Anmeldedaten oder Anmeldeanfragen direkt im Nutzer-Eingabefluss angezeigt werden.

@Composable
fun LoginField(textFieldState: TextFieldState) {
    val credentialData = remember {
        CredentialRequestData(
            // Specify Credential Manager request options
        )
    }

    BasicTextField(
        state = textFieldState,
        modifier = Modifier.semantics {
            credentialRequest = credentialData
        }
    )
}

Weitere wichtige Änderungen:

  • Unterstützung für Einstellungen für Schriftartvariationen in herunterladbaren Schriftarten.
  • Automatisches Scrollen beim Ziehen der Textauswahl über den sichtbaren Bereich hinaus in SelectionContainer aktiviert.
  • Unterstützung für automatische Interaktionsgeräusche (Klicks und Fokusnavigation) für Compose-Komponenten wurde hinzugefügt. Mit der neuen zusammensetzbaren Funktion SoundEffectOnInteraction können Nutzer diese Funktion deaktivieren. Aufgrund dieser Änderung müssen Semantik-Click-Listener jetzt aus dem Hauptthread aufgerufen werden. Das kann sich auf eine kleine Anzahl von Testläufen auswirken.
  • KeyboardType umfasst jetzt Date, Time, DateTime und SignedDecimal.
  • Für BasicSecureTextField wird jetzt standardmäßig TextObfuscationMode.System verwendet, während RevealLastTyped als absolute Überschreibung dient.

Layout-Optimierungen

Benannte Bereiche im Rasterlayout

Mit benannten Bereichen in der Komponente @Experimental Grid lassen sich jetzt einfacher komplexe 2D-Layouts erstellen. Anstatt numerische Spalten- und Zeilenindizes für alle Elemente zu verwalten, können Sie semantische Bereiche in Ihrem GridConfigurationScope definieren und Composables nach Bereichsname positionieren.

@OptIn(ExperimentalGridApi::class)
@Composable
fun DashboardLayout() {
    Grid(
        config = {
            area("header", row = 0, column = 0, rowSpan = 1, columnSpan = 2)
            area("sidebar", row = 1, column = 0)
            area("content", row = 1, column = 1)
            gap(16.dp)
        }
    ) {
        HeaderSection(modifier = Modifier.gridItem(areaId = "header"))
        NavigationSidebar(modifier = Modifier.gridItem(areaId = "sidebar"))
        MainContentView(modifier = Modifier.gridItem(areaId = "content"))
    }
}

Weitere Informationen finden Sie in der Dokumentation.

Leistung

Wie bei jeder Version investieren wir weiterhin in die Leistung von Compose, damit Sie mit dem Framework ansprechende und leistungsstarke Apps entwickeln können. In diesem Release haben wir uns auf die Verbesserung der Startleistung konzentriert. Die Zeit bis zur ersten Anzeige (die Zeit, die eine App benötigt, um den ersten Frame zu rendern) ist jetzt mit der von Views in unseren Benchmarks vergleichbar.

timetoinitialdisplay@2x _v2.png

Tests und Tool-Upgrades

Testsynchronisierung

In Compose 1.12 werden neue Test-APIs eingeführt, die die Testausführungszeiten verkürzen und die Instabilität beim Sampling von Status eliminieren sollen:

  • hasPendingWork: Prüft passiv, ob in der Benutzeroberfläche ausstehende Aufgaben vorhanden sind, ohne die Zeit voranzutreiben. Dies ist ideal für manuelle Animationsschleifen.
  • runWithoutImplicitWait: Deaktiviert die implizite Synchronisierung vorübergehend, wenn manuelle Takt-Frames durchlaufen werden (z.B. bei Animationstests).
@Test
fun testAnimationStateFast() {

composeTestRule.mainClock.autoAdvance = false
    
    while (composeTestRule.hasPendingWork()) {
        composeTestRule.mainClock.advanceTimeByFrame()
        composeTestRule.waitForIdle()
        
        composeTestRule.runOnUiThread {
            composeTestRule.runWithoutImplicitWait {
                // This is most effective when querying multiple nodes in a single frame. 
                // It prevents the redundant synchronization overhead that would 
                // otherwise occur on every individual query.
                val box1 = composeTestRule.onNodeWithTag("Box1").fetchSemanticsNode()
                val box2 = composeTestRule.onNodeWithTag("Box2").fetchSemanticsNode()
                
                assertThat(box1.boundsInRoot.right).isAtMost(box2.boundsInRoot.left)
            }
        }
    }
}

Weitere wichtige Änderungen:

  • Mit der captureToImage API können Sie jetzt ein Pop-up oder einen Dialog zusammen mit dem zugehörigen Anker in einem einzelnen Bitmap erfassen.
  • onRootWithViewInteraction wurde hinzugefügt, um semantische Compose-Suchanfragen auf bestimmte Android-Views zu beschränken. Das Testen von hybriden UIs wie RecyclerViews wird dadurch vereinfacht, ohne dass eindeutige Test-Tags im Produktionscode erforderlich sind.
  • @PreviewWrapper-Annotationen können jetzt auf benutzerdefinierte @MultiPreview-Klassen angewendet werden. So lassen sich wiederverwendbare Vorschaukonfigurationen (z. B. benutzerdefinierte Designs) für mehrere Komponenten erstellen.

Viel Spaß beim Komponieren!

Mit Compose 1.12 ist die App-Entwicklung einfacher und ausdrucksstärker als je zuvor. Zu den neuen Funktionen gehören Mesh-Verläufe, Unterstützung für einen breiten Farbraum, herunterladbare variable Schriftarten, die Integration von Credential Manager und schnellere Testtools. Wir freuen uns wie immer über Ihr Feedback. Teilen Sie uns bitte im Issue Tracker mit, was Sie von diesen Änderungen halten oder was Sie sich als Nächstes wünschen. Viel Spaß beim Komponieren!

Geschrieben von:
Weiterlesen