Karolarda dinamik güncellemeleri göster

Tiles 1.2'den itibaren dinamik ifadeler kullanarak platform verisi güncellemelerini aktarabilirsiniz. Daha sonra bu güncellemeleri kutularınızdaki animasyonlarla ilişkilendirebilirsiniz. Uygulamanız bu değerle ilgili güncellemeleri her saniye alır.

Dinamik ifadeler kullandığınızda, içeriği değişen bir kutucuğu yenilemek için tüm kutucuğu yenilemeniz gerekmez. Döşemelerinizde daha ilgi çekici bir deneyim oluşturmak için dinamik nesneleri canlandırın.

Dinamik ifadeleri veri kaynaklarıyla ilişkilendirme

androidx.wear.protolayout ve androidx.wear.protolayout.material ad alanları, alanları dinamik ifadeleri kabul eden birçok sınıf içerir. Bu duruma örnek olarak aşağıdakiler verilebilir:

Döşemenizdeki bir öğe için olası değer olarak dinamik ifade kullanmak istiyorsanız öğenin karşılık gelen *Prop dinamik özellik türünü kullanın ve veri kaynağını dinamik özellik türünün oluşturucu sınıfının setDynamicValue() yöntemine iletin.

Kutular aşağıdaki dinamik mülk türlerini destekler:

Fiziksel boyutları etkileyen bir dinamik ifade kullandığınızda (renk hariç bir döşemedeki herhangi bir değer), dize biçimi gibi bir dizi ilgili kısıtlamayı da belirtmeniz gerekir. Bu kısıtlamalar, sistem oluşturucunun bir değerin kutunuzda kaplayabileceği maksimum alanı belirlemesine olanak tanır. Genellikle, setLayoutConstraintsForDynamic* ile başlayan bir yöntemi çağırarak bu kısıtlamaları dinamik ifade düzeyinde değil, öğe düzeyinde belirtirsiniz.

Aşağıdaki kod snippet'inde, kalp atış hızındaki güncellemelerin 3 basamaklı olarak ve -- geri dönüş değeriyle nasıl gösterileceği açıklanmaktadır:

override fun onTileRequest(requestParams: RequestBuilders.TileRequest) =
    Futures.immediateFuture(
        Tile.Builder()
            .setResourcesVersion(RESOURCES_VERSION)
            .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
            .setTileTimeline(
                Timeline.fromLayoutElement(
                    Text.Builder(
                        this,
                        TypeBuilders.StringProp.Builder("--")
                            .setDynamicValue(
                                PlatformHealthSources.heartRateBpm()
                                    .format()
                                    .concat(DynamicBuilders.DynamicString.constant(" bpm"))
                            )
                            .build(),
                        TypeBuilders.StringLayoutConstraint.Builder("000").build(),
                    )
                        .build()
                )
            )
            .build()
    )

Tek bir kutucukta az sayıda ifade kullanın.

Wear OS, tek bir kutucuğun sahip olabileceği ifadelerin sayısını sınırlar. Bir kutucuk çok fazla sayıda dinamik ifade içeriyorsa dinamik değerler yoksayılır ve sistem, ilgili dinamik özellik türlerine sağladığınız statik değerlere geri döner.

Dinamik verileri bir durum nesnesinde birleştirme

Veri kaynaklarındaki en son güncelleme grubunu, değer oluşturma için kutunuza ilettiğiniz bir durumda birleştirebilirsiniz.

Durum bilgilerini kutularınızda kullanmak için aşağıdaki adımları tamamlayın:

  1. Döşemenizin durumunun farklı değerlerini temsil eden bir anahtar grubu oluşturun. Bu örnekte su alımı ve qqq notu için anahtarlar oluşturuluyor:

    companion object {
        val KEY_WATER_INTAKE = intAppDataKey("key_water_intake")
        val KEY_NOTE = stringAppDataKey("key_note")
    }

  2. onTileRequest() uygulamanızda setState() işlevini çağırın ve her anahtardan belirli bir dinamik veri değerine ilk eşlemeleri oluşturun:

    override fun onTileRequest(
        requestParams: RequestBuilders.TileRequest
    ): ListenableFuture<Tile?> {
        // If the tile hasn't had any state set yet, use the default values
        val state =
            if (requestParams.currentState.keyToValueMapping.isNotEmpty())
                requestParams.currentState
            else
                StateBuilders.State.Builder()
                    .setStateMap(
                        dynamicDataMapOf(
                            KEY_WATER_INTAKE mapTo 200,
                            KEY_NOTE mapTo "Good"
                        )
                    )
                    .build()
    
        return Futures.immediateFuture(
            Tile.Builder()
                // Set resources, timeline, and other tile properties.
                .setState(state)
                .build()
        )
    }

  3. Düzeninizi oluştururken bu verileri eyalete göre göstermek istediğiniz yerde Dynamic* türünde bir nesne kullanın. Ayrıca, önceki değerden geçerli değere geçişi gösteren bir animasyon görüntülemek için animate() işlevini de çağırabilirsiniz:

    val waterIntakeValue =
        DynamicBuilders.DynamicInt32.from(KEY_WATER_INTAKE)

  4. Gerekirse durumu yeni değerlerle de güncelleyebilirsiniz. Bu, bir kutunun LoadAction parçası olabilir.

    Bu örnekte, su alımı değeri 400 olarak güncellenir:

    val loadAction =
        loadAction(
            dynamicDataMapOf(
                KEY_WATER_INTAKE mapTo 400,
                KEY_NOTE mapTo "Outstanding"
            )
        )