Karolarda dinamik güncellemeleri göster

Tiles 1.2'den itibaren dinamik ifadeler kullanarak platform verisi güncellemelerini yayınlayabilirsiniz. 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 kutuyu yenilemek için tüm kutuyu 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 özellik türlerini destekler:

Fiziksel boyutları etkileyen dinamik bir ifade kullandığınızda (renk hariç bir kutudaki 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ı güncellemelerinin 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 kutuda az sayıda ifade kullanın.

Wear OS, tek bir kutucuğun sahip olabileceği ifade sayısını sınırlar. Bir kutucukta çok fazla sayıda dinamik ifade varsa 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 dizi anahtar 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östermek 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"
            )
        )