Karolarda dinamik güncellemeleri göster

Kartlar 1.2'den itibaren, platforma ait veri güncellemelerini şurada yayınlayabilirsiniz: dinamik ifadeler hakkında daha fazla bilgi edinin. Daha sonra bu güncellemeleri animasyonlarla ilişkilendirebilirsiniz dokunun. Uygulamanız her saniye bu değerde güncelleme alıyor.

Dinamik ifadeleri kullandığınızda, karo izin verebilirsiniz. Karolarınızda daha ilgi çekici bir deneyim oluşturmak için animasyon bu dinamik nesnelerden bahsetmek istiyorum.

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. Aşağıda çeşitli örnekler verilmiştir:

Dinamik ifadeyi, karonuzdaki bir öğe için olası değer olarak kullanmak üzere öğeye karşılık gelen *Prop dinamik özellik türüne karşılık gelen ve verileri iletir. dinamik özellik türünün derleyici sınıfına ait setDynamicValue() kaynağı yöntemidir.

Karolar şu dinamik mülk türlerini destekler:

Fiziksel boyutları etkileyen dinamik bir ifade kullandığınızda, renk hariç bir karo — kullanabilirsiniz. Bu kısıtlamalar, sistem oluşturucunun karo içinde bir değerin kaplayabileceği maksimum alan miktarıdır. Genellikle bu kısıtlamaları dinamik ifadede değil, öğe düzeyinde belirtin düzeyi için setLayoutConstraintsForDynamic* ile başlayan bir yöntemi çağırın.

Aşağıdaki kod snippet'i, nabız ile ilgili güncellemelerin 3 -- yedek değeri olan basamaklar:

Kotlin

import androidx.wear.protolayout.material.Text

public 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(),
                StringLayoutConstraint.Builder("000")
                    .build()
                ).build()
            )
        ).build()
    )

Java

import androidx.wear.protolayout.material.Text;

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull TileRequest requestParams
) {
    return Futures.immediateFuture(new Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
        .setTileTimeline(Timeline.fromLayoutElement(
            new Text.Builder(
                this,
                new TypeBuilders.StringProp.Builder("--")
                    .setDynamicValue(PlatformHealthSources.heartRateBpm()
                        .format()
                        .concat(DynamicBuilders.DynamicString.constant(" bpm")))
                    .build(),
                new StringLayoutConstraint.Builder("000")
                    .build()
                ).build())
        ).build()
    );
}

Tek bir parça içinde az sayıda ifade kullanma

Wear OS, tek bir kartın yapabileceği ifadelerin sayısına sınır verir. sahip. Bir karo çok fazla toplam dinamik ifade içeriyorsa dinamik değerler yok sayılır ve sistem, kontrol paneline sağladığınız statik değerlere ilgili dinamik özellik türlerine benzer.

Aşağıdaki ifade kümesini bir karoya güvenle ekleyebilirsiniz çünkü çok sayıda toplam ifade yoktur. Dolayısıyla, blok doğru şekilde davranır:

Kotlin

val personHealthInfo = DynamicString.constant("This person has walked ")
    .concat(PlatformHealthSources.dailySteps()
        .div(1000)
        .format())
    .concat("thousands of steps and has a current heart rate ")
    .concat(PlatformHealthSources.heartRateBpm()
        .format())
    .concat(" beats per minute")

Java

DynamicString personHealthInfo =
    DynamicString.constant("This person has walked ")
        .concat(PlatformHealthSources.dailySteps()
            .div(1000)
            .format())
        .concat("thousands of steps and has a current heart rate ")
        .concat(PlatformHealthSources.heartRateBpm()
            .format())
        .concat(" beats per minute");

Ancak bu karoda çok fazla ifade olabilir:

Kotlin

// Note that this template is applied as many times as the loop iterates.
// The system doesn't reuse dynamic expressions.
val dynamicStringTemplate = PlatformHealthSources.dailySteps()
    .div(1000)
    .format()

for (person in people) {
  // SomeProperty
    .setDynamicValue(
        DynamicBuilders.DynamicString.constant("Steps for ")
            .concat(person)
            .concat(" are ")
            .concat(dynamicStringTemplate)
    )
}

Java

// Note that this template is applied as many times as the loop iterates.
// The system doesn't reuse dynamic expressions.
DynamicString dynamicStringTemplate =
    PlatformHealthSources.dailySteps()
        .div(1000)
        .format();

for (int i = 0; i < people.size(); i++) {
  // SomeProperty
    .setDynamicValue(
        DynamicBuilders.DynamicString.constant("Steps for ")
            .concat(people[i])
            .concat(" are ")
            .concat(dynamicStringTemplate)
    );
}

Dinamik verileri bir durum nesnesinde birleştirme

Veri kaynaklarından gelen en son güncelleme grubunu bir eyalet altında birleştirebilirsiniz. bunu değer oluşturma için karonuza geçirebilirsiniz.

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

  1. Karonuzun farklı değerlerini temsil eden bir dizi anahtar oluşturun. durumu. Bu örnekte su kullanımı için anahtarlar ve bir not oluşmuştur:

    Kotlin

    companion object {
        val KEY_WATER_INTAKE = AppDataKey<DynamicInt32>("water_intake")
        val KEY_NOTE = AppDataKey<DynamicString>("note")
    }
    

    Java

    private static final AppDataKey<DynamicInt32> KEY_WATER_INTAKE =
        new AppDataKey<DynamicInt32>("water_intake");
    private static final AppDataKey<DynamicString> KEY_NOTE =
        new AppDataKey<DynamicString>("note");
    
  2. onTileRequest() uygulamanızda setState() işlevini çağırın ve belirli bir dinamik veri değerine ilk eşlemeleri yapma:

    Kotlin

    override fun onTileRequest(requestParams: TileRequest):
            ListenableFuture<Tile> {
        val state = State.Builder()
            .addKeyToValueMapping(KEY_WATER_INTAKE,
                DynamicDataBuilders.DynamicDataValue.fromInt(200))
            .addKeyToValueMapping(KEY_NOTE,
                DynamicDataBuilders.DynamicDataValue.fromString("Note about day"))
        .build()
        // ...
    
        return Futures.immediateFuture(Tile.Builder()
            // Set resources, timeline, and other tile properties.
            .setState(state)
            .build()
        )
    

    Java

    @Override
    protected ListenableFuture<Tile> onTileRequest(
                ListenableFuture<Tile> {
        State state = new State.Builder()
            .addKeyToValueMapping(KEY_WATER_INTAKE,
                DynamicDataBuilders.DynamicDataValue.fromInt(200))
            .addKeyToValueMapping(KEY_NOTE,
                DynamicDataBuilders.DynamicDataValue.fromString("Note about day"))
        .build();
        // ...
    
        return Futures.immediateFuture(Tile.Builder()
            // Set resources, timeline, and other tile properties.
            .setState(state)
            .build()
        );
    }
    
  3. Düzeninizi oluştururken, bu verileri göstermek istediğiniz bir yerde Dynamic* türünde bir nesne kullanın. Ayrıca, animate() numaralı telefonu arayarak önceki değerden geçerli değere bir animasyon gösterin:

    Kotlin

    DynamicInt32.from(KEY_WATER_INTAKE).animate()
    

    Java

    DynamicInt32.from(KEY_WATER_INTAKE).animate();
    
  4. Gerektiğinde durumu yeni değerlerle de güncelleyebilirsiniz. Bu özellik, LoadAction öğesinin bir parçasıdır.

    Bu örnekte su tüketimi değeri 400 olarak güncellenmiştir:

    Kotlin

    state.addKeyToValueMapping(KEY_WATER_INTAKE,
            DynamicDataBuilders.DynamicDataValue.fromInt(400))
    

    Java

    state.addKeyToValueMapping(KEY_WATER_INTAKE,
            DynamicDataBuilders.DynamicDataValue.fromInt(400));
    
ziyaret edin. ziyaret edin.