Bugün, Jetpack Compose Ağustos 2026 sürümü kararlı hale geldi. Bu sürüm, temel Compose modüllerine 1.12 sürümünü getiriyor (tam BOM eşlemesine bakın), Mesh Gradients ve Geniş Renk Gamı (WCG) desteği gibi zengin görsel API'ler, Grid içindeki adlandırılmış alanlar gibi yapısal düzen özellikleri, Android'in Kimlik Bilgisi Yöneticisi ile sorunsuz entegrasyon ve önemli test ve performans iyileştirmeleri sunuyor.
Projenizi bugünkü sürüme güncellemek için Compose BOM sürümünüzü 2026.08.00 olarak yükseltin:
implementation(platform("androidx.compose:compose-bom:2026.08.00"))
Önemli Değişiklikler
- AGP ve Compile SDK: Compose 1.12, compileSdk'yi API 37'ye güncelliyor ve minimum AGP 9.1.2 gerektiriyor. Hatırlatmak gerekirse, Compose her zaman en yeni compileSdk'yi hedefleyecektir. Bu değişiklik hakkında daha fazla bilgiyi burada bulabilirsiniz.
Modifier.onFirstVisible()desteği sonlandırıldı: Daha hassas görünürlük eşiği izleme sağlayan Modifier.onVisibilityChanged()'a geçin.
Grafik
Ağ Gradyanları
Compose 1.12, çok noktalı ve doğal renk gradyanları oluşturmanıza yardımcı olmak için MeshGradientPainter özelliğini sunar.
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) )
Daha fazla bilgi ve örnek için belgelere bakın.
Geniş Renk Gamı ve HDR Desteği
Modern ekranlar, daha iyi renk doğruluğu ve daha yüksek dinamik aralık sunar. Compose 1.12'de, Compose grafikleri, boya ve gölgelendiricilerinde geniş renk gamı (P3) ve HDR oluşturma için tam ardışık düzen desteği etkinleştirildi. sRGB dışındaki renk uzaylarında (örneğin Display P3) tanımlanan renkler, renk sınırlaması olmaksızın platformda görüntülenmeye kadar korunur. Desteklenmeyen bir renk uzayı (örneğin CieXyz, CieLab veya Oklab) kullanılıyorsa, desteklenmeyen bir Android sürümündeki bir renk uzayına (örneğin Android 13 ve altı sürümlerde Bt2020Hlg) bağlı kalınıyorsa veya uygulama Android 9 (API 28) ve altı sürümlerde çalışıyorsa, renkler güvenli bir şekilde sRGB'ye geri dönecektir.
Diğer önemli değişiklikler:
LayerOutsetseklendiGraphicsLayer&Modifier.graphicsLayerBu özelliği kullanarak katmanın görsel sınırlarını ölçülen boyutunun ötesine genişletebilirsiniz. Katman, ekran dışı arabelleğe yükseltildiğinde örtülüclipToBoundsdavranışını önlemek içinLayerOutsetsuygulayın.
Stiller
Google I/O'da, bileşenleri biçimlendirmenin birleşik ve performanslı bir yolu olan Compose Styles API için ilk vizyonumuzu paylaştık. O zamandan beri, kesin tip güvenliğini ve öngörülebilir doğruluğu garanti altına almak ve özel tasarım sistemlerinin oluşturulmasını desteklemek için temel mimariyi geliştirmeye devam ettik.
Bu temel katmanın doğru olmasını sağlamak için API deneysel olarak kalacak ve önemli değişiklikler bekleyebilirsiniz.
Çalışma Zamanı Optimizasyonları
Anahtarlı SideEffect Overload
SideEffect artık anahtar bağımsız değişkenlerini destekliyor. Bu sayede, belirli anahtarlar her değiştiğinde tek seferlik yan etkiler tetikleyebilirsiniz. Bu, eş yordam veya atma bloğuna ihtiyacınız olmadığında LaunchedEffect veya DisposableEffect kullanmaya kıyasla daha iyi performans elde etmenizi sağlayabilir. SideEffect, LaunchedEffect'den% 90'a kadar, DisposableEffect'den ise yaklaşık% 20 daha hızlıdır. SideEffect efektinin DisposableEffect ve LaunchedEffect efektlerinden önce devreye girdiğini unutmayın; bu nedenle, mevcut efektleri bu API'ye taşırken, özellikle de geçerli kare tamamlandıktan sonra başlatılmak üzere gönderilmeye bağlı olan LaunchedEffects efektleri için dikkatli olun.
@Composable fun AnalyticsTracker(userId: String, screenName: String) { SideEffect(key1 = userId, key2 = screenName) { analytics.logScreenView(userId, screenName) } }
Animasyon
DeferredTargetAnimationDeneysel aşamadan çıktı.
Etkileşimli İki Aşamalı Geçişler
- Yeni composable'lar:
DeferredAnimatedContentveDeferredAnimatedVisibility, iki aşamalı geçişler oluşturmaya olanak tanır. Örneğin, tahmin edilen geri gitme hareketi izleme için kullanılabilir. - Manuel animasyon kontrolü: Geçişin ertelenmiş aşamasında, animasyonlu özellikler (ör.ölçek veya ofset) artık manuel olarak anlık şekilde değiştirilebilir (ör. kaydırma hareketini izleme).
- Sorunsuz geçiş: Ertelenen aşama sona erdiğinde geçiş motoru devreye girer ve otomatik geçişe hız aktarımı da dahil olmak üzere sorunsuz bir geçiş gerçekleştirir.
- Paylaşılan öğe desteği: Yeni
permitTransformDuringDeferredTransitionbayrak içindeSharedContentConfigPaylaşılan öğelerin, ertelenmiş geçiş aşamasında ana kapsayıcılarıyla birlikte görsel olarak dönüşüp dönüşmeyeceğini kontrol eder.
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) }
Aşağıda, harekete dayalı animasyonun tetiklenen animasyona aktarıldığı kullanım alanlarına dair iki demo bulunmaktadır:
Metin, Giriş ve Platform Entegrasyonları
Düzenlenebilir Metin Biçimlendirmesi
Yeni API'ler, düzenlenebilir metinler için zengin metin biçimlendirme özelliği sunuyor.BasicTextField . Artık SpanStyle ve ParagraphStyle kullanarak satır içi karakter ve paragraf biçimlendirmesini programatik olarak uygulayabilir ve değiştirebilirsiniz. Bunun için TextFieldBuffer kapsamı (ör. textFieldState.edit { ... } veya InputTransformation içinde) içindeki yeni addStyle() yöntemini kullanın. Ayrıca, TextFieldBuffer, getSpanStyles() ve getParagraphStyles() API'lerini sağlayarak TrackedRange nesnelerini döndürür. Bu sayede, uygulanan stilleri okuyabilir, güncelleyebilir veya kaldırabilirsiniz. Biçimlendirme oluşturma işlemini tamamlamak için TextFieldState artık aralıklar genelinde etkin stilleri sorgulamak üzere salt okunur bir textStyles özelliği sunuyor. TextFieldBuffer ise düzenlemeden önce biçimlendirme durumunu incelemek için originalTextStyles sağlıyor. Metin biçimlendirme ve özel ek açıklamalar, yapılandırma değişikliklerinde korunur.
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
Metin Seçimi
Yeni bir SelectionState API, SelectionContainer içindeki metin seçiminde programatik kontrol ve gözlemlenebilirlik sağlar. SelectionState nesnesini rememberSelectionState() aracılığıyla yukarı taşımak ve SelectionContainer'ye geçirmek, selectedTexts'ü AnnotatedStrings'ün reaktif bir listesi olarak ortaya çıkarır ve selectAll(), clear(), select(TextRange) ve extendSelectionByWord() gibi yöntemler sağlar.
Ayrıca, düzen sırasındaki tüm seçilebilir metin öğelerini almak için getSelectableTexts() kullanın ve SelectionContainer içindeki composable'lar arasında metin seçmek için genel bir aralık kullanın.
@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.") } } }
Kimlik Bilgisi Yöneticisi Entegrasyonu
Compose metin alanları artık Otomatik Doldurma Çerçevesi aracılığıyla Android'in Credential Manager (API 34+) ile yerel olarak entegre edilmektedir (API 34'ün altındaki sürümlerde androidx.credentials library tarafından işlenir). Yeni credentialRequest anlamsal yapısı CredentialRequestData ile eklenerek metin girişleri, kullanıcı girişi akışında doğrudan geçiş anahtarlarını, kayıtlı kimlik bilgilerini veya oturum açma isteklerini isteyebilir.
@Composable fun LoginField(textFieldState: TextFieldState) { val credentialData = remember { CredentialRequestData( // Specify Credential Manager request options ) } BasicTextField( state = textFieldState, modifier = Modifier.semantics { credentialRequest = credentialData } ) }
Diğer önemli değişiklikler:
- İndirilebilir yazı tiplerinde yazı tipi varyasyon ayarları desteği.
- Metin seçimini görüntüleme alanının dışına sürüklediğinizde otomatik kaydırma özelliği etkinleştirildi.
SelectionContainer. - Compose bileşenlerine otomatik etkileşim sesleri (tıklamalar ve odak navigasyonu) desteği eklendi, yeni bir özellik de eklendi.
SoundEffectOnInteractionOpt-out seçeneğine izin verecek şekilde düzenlenebilir. Bu değişiklik sonucunda, semantik tıklama işleyicilerinin artık ana ileti dizisinden çağrılması gerektiğini ve bunun az sayıda test senaryosunu etkileyebileceğini unutmayın. KeyboardTypeartıkDate,Time,DateTimeveSignedDecimal'i içeriyor.BasicSecureTextFieldartık varsayılan olarakTextObfuscationMode.SystemkullanırkenRevealLastTypedmutlak bir geçersiz kılma işlevi görür.
Düzen geliştirmeleri
Izgara Düzeninde Adlandırılmış Alanlar
@Experimental Izgara bileşenindeki adlandırılmış alanlar sayesinde artık karmaşık 2D düzenler oluşturmak daha kolay. Öğeler genelinde sayısal sütun ve satır dizinlerini yönetmek yerine GridConfigurationScope içinde anlamsal bölgeler tanımlayabilir ve composable'ları alan adına göre konumlandırabilirsiniz.
@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")) } }
Daha fazla bilgi için belgelere bakın.
Performans
Her sürümde olduğu gibi, Compose'un performansına yatırım yapmaya devam ediyoruz. Böylece bu çerçeve, güzel ve yüksek performanslı uygulamalar geliştirmenize yardımcı oluyor. Bu sürümde, başlangıç performansını iyileştirmeye odaklandık ve artık karşılaştırmalarımızda Görüntüleme sayısı ile karşılaştırılabilir bir İlk Görüntüleme Süresi (bir uygulamanın ilk karesini oluşturması için geçen süre) görüyoruz.
Test ve Araç Geliştirmeleri
Test Senkronizasyonu
Compose 1.12, test yürütme sürelerini kısaltmak ve durum örneklemesi sırasında kararsızlığı ortadan kaldırmak için tasarlanmış yeni test API'lerini kullanıma sunar:
hasPendingWork: Saat ilerlemeden kullanıcı arayüzünde bekleyen iş olup olmadığını pasif olarak kontrol eder. Bu, manuel animasyon döngüleri için idealdir.runWithoutImplicitWait: Manuel saat kareleri arasında ilerlerken (ör. animasyon testleri) örtülü senkronizasyonu geçici olarak devre dışı bırakır.
@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) } } } }
Diğer önemli değişiklikler:
- O
captureToImageAPI artık bir açılır pencereyi veya iletişim kutusunu, bağlantı noktasıyla birlikte tek bir bitmap'te yakalamanıza olanak tanıyor. - Eklendi
onRootWithViewInteractionCompose semantik aramalarını belirli Android Görünümlerine göre sınırlandırmak. Bu sayede, üretim kodunda benzersiz test etiketleri gerektirmedenRecyclerViewsgibi karma kullanıcı arayüzlerini test etmek kolaylaşır. @PreviewWrapperek açıklamaları artık özel@MultiPreviewsınıflarına uygulanabilir. Böylece, birden fazla bileşende yeniden kullanılabilir önizleme kurulumları (ör. özel temalar) oluşturulabilir.
Keyifli beste çalışmaları!
Compose 1.12, mesh gradyanları, geniş renk gamı desteği, indirilebilir değişken yazı tipleri, Kimlik Bilgisi Yöneticisi entegrasyonu ve daha hızlı test araçlarıyla uygulama geliştirmeyi her zamankinden daha kolay ve daha etkileyici hale getiriyor. Her zaman olduğu gibi, görüşlerinize değer veriyoruz, bu nedenle lütfen bu değişiklikler hakkındaki geri bildirimlerinizi veya bundan sonra ne görmek istediğinizi sorun takip sistemimizde paylaşın. Keyifli besteler!
-
Ürün HaberleriPixel 11 Pro Fold, Pixel Watch 5 ve tüm Pixel ailesinin tanıtılmasıyla birlikte kullanıcılar, farklı ekran boyutları, benzersiz duruşlar ve akıllı deneyimler arasında sorunsuz bir şekilde geçiş yapıyor.
-
Ürün HaberleriBugün, Jetpack Compose 1.0'ın yayınlanmasının üzerinden geçen beş yılı resmi olarak kutluyoruz. 28 Temmuz 2021'de duyurulan 1.0 sürümünden en son 1.11 sürümüne kadar API'lerin yıllar içinde önemli ölçüde geliştiğini gördük ve bu gelişmeyi kutlamak istiyoruz.
Rebecca Franks, Nick Butcher, Loryn Hairston • Okuma süresi 4 dakika -
Ürün HaberleriJetpack Compose'un kullanıma sunulmasından bu yana geçen yaklaşık 5 yıl içinde, çeşitli Android cihazlarda muhteşem kullanıcı arayüzleri oluşturmak için ihtiyaç duyduğunuz tüm özellikleri, performansı ve araçları size sunmak üzere yatırım yaptık.
Nick Butcher • Okuma süresi 2 dakika
Android geliştirmeyle ilgili en son analizleri her hafta gelen kutunuza alın.