Karo 1.2'den itibaren, platform verisi güncellemelerini dinamik ifadeler kullanarak akış olarak görüntüleyebilirsiniz. Daha sonra bu güncellemeleri karolarınızdaki animasyonlarla ilişkilendirebilirsiniz. Uygulamanız bu değer için saniyede bir güncelleme alır.
Dinamik ifadeler kullandığınızda, içeriği değiştiğinde karonun tamamını yenilemeniz gerekmez. Karolarınızda daha ilgi çekici bir deneyim oluşturmak için bu 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.
Aşağıda konuyla ilgili olarak birkaç örnek verilmiştir:
Arc
nesnesinin uzunluğu veCircularProgressIndicator
nesnesinin uzunluğu dahil olmak üzere çeşitli uzunluk değerleri.Button
nesnesinin içerik rengi gibi herhangi bir renk.Text
nesnesinin içeriği, birLayoutElementsBuilders.Text
nesnesinin içeriği ve birCircularProgressIndicator
nesnesinin içerik açıklaması dahil olmak üzere birçok dize değeri.
Karonuzdaki bir öğe için olası değer olarak dinamik ifadeyi kullanmak isterseniz öğenin karşılık gelen *Prop
dinamik özellik türünü kullanın ve veri kaynağını, dinamik mülk türünün oluşturucu sınıfının setDynamicValue()
yöntemine iletin.
Karolar, şu dinamik mülk türlerini destekler:
- Ekrandan bağımsız piksellerde ölçülen doğrusal boyutlar için
DimensionBuilders.DpProp
değerini kullanın. - Derece cinsinden ölçülen açısal boyutlar için
DimensionBuilders.DegreesProp
değerini kullanın. - Dize değerleri için
TypeBuilders.StringProp
kullanın. - Renk değerleri için
ColorBuilders.ColorProp
kullanın. - Kayan nokta değerleri için
TypeBuilders.FloatProp
değerini kullanın.
Fiziksel boyutları etkileyen dinamik bir ifade (renk hariç kutudaki tüm değerler) kullandığınızda, dize biçimi gibi bir dizi ilgili kısıtlamayı da belirtmeniz gerekir. Bu kısıtlamalar, sistem oluşturucunun bir değerin karonunuzda kaplayabileceği maksimum alan miktarını belirlemesine olanak tanır. Genellikle bu kısıtlamaları dinamik ifade düzeyinde değil, setLayoutConstraintsForDynamic*
ile başlayan bir yöntemi çağırarak öğe düzeyinde belirtirsiniz.
Aşağıdaki kod snippet'inde, nabız güncellemelerinin 3 basamak kullanarak ve --
yedek değeriyle nasıl gösterileceği gösterilmektedir:
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çada az sayıda ifade kullanma
Wear OS, tek bir kartın sahip olabileceği ifade sayısını sınırlar. Parça çok sayıda toplam dinamik ifade içeriyorsa dinamik değerler yoksayılır ve sistem, ilgili dinamik özellik türlerine sağladığınız statik değerleri kullanır.
Toplamda çok fazla ifade olmadığından aşağıdaki ifade kümesini bir karoya güvenli bir şekilde ekleyebilirsiniz. Bu nedenle, karo 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, değer oluşturma için blokunuza aktardığınız bir durum altında birleştirebilirsiniz.
Karolarınızda durum bilgilerini kullanmak için aşağıdaki adımları tamamlayın:
Karo durumunuzun farklı değerlerini temsil eden bir anahtar grubu oluşturun. Bu örnekte su girişi anahtarları ve bir not oluşturulur:
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");
onTileRequest()
uygulamanızdasetState()
yöntemini çağırın ve her bir anahtardan belirli bir dinamik veri değerine ilk eşlemeler yapın: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() ); }
Düzeninizi oluştururken bu verileri mevcut durumdan göstermek istediğiniz bir yerde
Dynamic*
türünde bir nesne kullanın. Önceki değerden geçerli değere bir animasyon göstermek içinanimate()
yöntemini de çağırabilirsiniz:Kotlin
DynamicInt32.from(KEY_WATER_INTAKE).animate()
Java
DynamicInt32.from(KEY_WATER_INTAKE).animate();
Gerektiğinde durumu yeni değerlerle de güncelleyebilirsiniz. Bu, karonun
LoadAction
parçası olabilir.Bu örnekte, su girişi 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));