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:
- Bir
Arc
nesnesinin uzunluğu veCircularProgressIndicator
nesnenin uzunluğu. Button
nesnesinin içerik rengi gibi herhangi bir renk.- Bir
Text
nesnesinin içeriği,LayoutElementsBuilders.Text
nesnesinin içeriği ve içerik birCircularProgressIndicator
nesnesinin açıklaması.
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:
- Görüntüden bağımsız piksellerle ölçülen doğrusal boyutlar için
DimensionBuilders.DpProp
. - Derece cinsinden ölçülen açısal boyutlar için
DimensionBuilders.DegreesProp
. - Dize değerleri için
TypeBuilders.StringProp
değerini kullanın. - Renk değerleri için
ColorBuilders.ColorProp
değerini kullanın. - Kayan nokta değerleri için
TypeBuilders.FloatProp
değerini kullanın.
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:
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");
onTileRequest()
uygulamanızdasetState()
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() ); }
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();
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));
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- ProtoLayout ad alanlarına taşıma
- Kartları kullanmaya başlama
- Diğer noktalar