Ürün Haberleri

Jetpack Compose'un Ağustos 2026 sürümündeki yenilikler neler?

Okuma süresi 5 dakika
Nick Butcher'ın profilini görüntüleyin
Nick Butcher Ürün Yöneticisi

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.

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)
)

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.graphicsLayer Bu ö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ü clipToBounds davranışını önlemek için LayerOutsets uygulayı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

Etkileşimli İki Aşamalı Geçişler

  • Yeni composable'larDeferredAnimatedContent ve DeferredAnimatedVisibility, 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: YenipermitTransformDuringDeferredTransition bayrak içindeSharedContentConfig Paylaşı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:

colorCards.gif

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, selectedTextsAnnotatedStrings'ü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.SoundEffectOnInteraction Opt-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.
  • KeyboardType artık Date, Time, DateTime ve SignedDecimal'i içeriyor.
  • BasicSecureTextField artık varsayılan olarak TextObfuscationMode.System kullanırken RevealLastTyped mutlak 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.

timetoinitialdisplay@2x _v2.png

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:

  • OcaptureToImage API 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.
  • EklendionRootWithViewInteraction Compose semantik aramalarını belirli Android Görünümlerine göre sınırlandırmak. Bu sayede, üretim kodunda benzersiz test etiketleri gerektirmeden RecyclerViews gibi karma kullanıcı arayüzlerini test etmek kolaylaşır.
  • @PreviewWrapper ek açıklamaları artık özel @MultiPreview sı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!

Okumaya devam et