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.
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:
LayerOutsetswurde zuGraphicsLayerundModifier.graphicsLayerhinzugefügt. Damit können Sie die visuellen Grenzen der Ebene über ihre gemessene Größe hinaus erweitern. Wenden SieLayerOutsetsan, um das impliziteclipToBounds-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
DeferredTargetAnimationist nicht mehr in der Testphase.
Interaktive zweistufige Übergänge
- Neue Composables: Mit
DeferredAnimatedContentundDeferredAnimatedVisibilitylassen 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
permitTransformDuringDeferredTransitioninSharedContentConfigwird 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:
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
SelectionContaineraktiviert. - Unterstützung für automatische Interaktionsgeräusche (Klicks und Fokusnavigation) für Compose-Komponenten wurde hinzugefügt. Mit der neuen zusammensetzbaren Funktion
SoundEffectOnInteractionkö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. KeyboardTypeumfasst jetztDate,Time,DateTimeundSignedDecimal.- Für
BasicSecureTextFieldwird jetzt standardmäßigTextObfuscationMode.Systemverwendet, währendRevealLastTypedals 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.
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
captureToImageAPI können Sie jetzt ein Pop-up oder einen Dialog zusammen mit dem zugehörigen Anker in einem einzelnen Bitmap erfassen. onRootWithViewInteractionwurde hinzugefügt, um semantische Compose-Suchanfragen auf bestimmte Android-Views zu beschränken. Das Testen von hybriden UIs wieRecyclerViewswird 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!
-
ProduktneuigkeitenGooglebook ist eine neue Kategorie von Laptops, die auf einer gemeinsamen Android-Grundlage basieren. Leistungsstarke Hardware von Partnern wie HP, Dell, Lenovo, Acer und Asus kombiniert die Mobilität von Mobilgeräten mit der Leistung von Desktop-Computern.
Fahd Imtiaz, Loryn Hairston • Lesezeit: 4 Minuten -
ProduktneuigkeitenMit der Einführung des Pixel 11 Pro Fold, der Pixel Watch 5 und der gesamten Pixel-Familie können Nutzer nahtlos auf verschiedenen Bildschirmgrößen, in unterschiedlichen Positionen und mit intelligenten Funktionen arbeiten.
-
ProduktneuigkeitenHeute feiern wir offiziell den fünften Jahrestag der Veröffentlichung von Jetpack Compose 1.0. Seit der Ankündigung von Version 1.0 am 28. Juli 2021 haben sich die APIs bis zur aktuellen Version 1.11 deutlich weiterentwickelt. Das möchten wir zum Anlass nehmen, um auf die Entwicklung zurückzublicken.
Rebecca Franks, Nick Butcher, Loryn Hairston • Lesezeit: 4 Minuten
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.