Kutular 1.2'den itibaren dinamik ifadeleri kullanarak platform veri güncellemelerini aktarabilirsiniz. Ardından bu güncellemeleri kartlarınızdaki animasyonlarla ilişkilendirebilirsiniz. Uygulamanız bu değerle ilgili güncellemeleri saniyede bir alır.
Dinamik ifadeleri kullanarak, içeriği değişen karonun tamamını yenilemeniz gerekmez. Kartları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ında, alanları dinamik ifadeleri kabul eden birçok sınıf bulunur.
Aşağıda bu tür içeriklere örnek olarak verilecek birkaç içerik türü verilmiştir:
- Bir
Arc
nesnesinin uzunluğu ve birCircularProgressIndicator
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,LayoutElementsBuilders.Text
nesnesinin içeriği veCircularProgressIndicator
nesnesinin içerik açıklaması gibi birçok dize değeri.
Kartınızdaki bir öğenin olası değeri olarak dinamik ifade kullanmak için öğenin ilgili *Prop
dinamik mülk 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.
Kutular aşağıdaki dinamik mülk türlerini destekler:
- Gösterimden bağımsız piksel cinsinden ölçülen doğrusal boyutlar için
DimensionBuilders.DpProp
değerini kullanın. - Derece cinsinden ölçülen açısal boyutlar için
DimensionBuilders.DegreesProp
simgesini kullanın. - Dize değerleri için
TypeBuilders.StringProp
kullanın. - Renk değerleri için
ColorBuilders.ColorProp
simgesini kullanın. - Kayan nokta değerleri için
TypeBuilders.FloatProp
kullanın.
Fiziksel boyutları (bir karodaki renk hariç tüm değerler) etkileyen dinamik bir ifade 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 karonuzda kaplayabildiği maksimum alan miktarını belirlemesine olanak tanır. Genellikle, setLayoutConstraintsForDynamic*
ile başlayan bir yöntem ç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 --
yedek değeriyle birlikte 3 basamak kullanılarak nasıl gösterileceği gösterilmektedir:
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 karoda az sayıda ifade kullanın
Wear OS, tek bir kartın sahip olabileceği ifade sayısına sınırlama getirir. Bir karo toplamda çok fazla dinamik ifade içeriyorsa dinamik değerler yoksayılır ve sistem, ilgili dinamik mülk türlerine sağladığınız statik değerlere geri döner.
Dinamik verileri bir durum nesnesine birleştirme
Veri kaynaklarından gelen en son güncelleme grubunu bir durum olarak birleştirebilir ve değer oluşturma için karonuza iletebilirsiniz.
Kartlarınızda eyalet bilgilerini kullanmak için aşağıdaki adımları uygulayın:
Kartınızın durumunun farklı değerlerini temsil eden bir anahtar grubu oluşturun. Bu örnekte, su tüketimi ve bir not için anahtarlar 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()
'u çağırın ve her anahtardan belirli bir dinamik veri değerine yönelik ilk eşlemeleri oluşturun: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() ); }
Eyaletten alınan bu verileri göstermek istediğiniz bir yerde düzeninizi oluştururken
Dynamic*
türü bir nesne kullanın. Önceki değerden mevcut değere animasyon göstermek içinanimate()
işlevini de çağırabilirsiniz:Kotlin
DynamicInt32.from(KEY_WATER_INTAKE).animate()
Java
DynamicInt32.from(KEY_WATER_INTAKE).animate();
Gerekirse durumu yeni değerlerle de güncelleyebilirsiniz. Bu, kartın
LoadAction
parçası olabilir.Bu örnekte, su tüketimi değeri
400
olarak güncellenmiştir:Kotlin
val loadAction = LoadAction.Builder() .setRequestState( State.Builder() .addKeyToValueMapping( KEY_WATER_INTAKE, DynamicDataBuilders.DynamicDataValue.fromInt(400) ) .build() ) .build()
Java
LoadAction loadAction = new LoadAction.Builder() .setRequestState( new State.Builder() .addKeyToValueMapping( KEY_WATER_INTAKE, DynamicDataBuilders.DynamicDataValue.fromInt(400) ).build() ).build();
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- ProtoLayout ad alanlarına taşıma
- Kartları kullanmaya başlama
- Dikkat edilmesi gereken diğer noktalar