Tiles 1.2'den itibaren dinamik ifadeler kullanarak platform verisi güncellemelerini aktarabilirsiniz. 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 kutucuğu yenilemek için tüm kutucuğu 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:
Arcnesnesinin uzunluğu veCircularProgressIndicatornesnesinin uzunluğu dahil olmak üzere çeşitli uzunluk değerleri.Buttonnesnesinin içerik rengi gibi herhangi bir renk.Textnesnesinin içeriği,LayoutElementsBuilders.Textnesnesinin içeriği veCircularProgressIndicatornesnesinin içerik açıklaması dahil olmak üzere birçok dize değeri.
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 mülk türlerini destekler:
- Görüntüden bağımsız piksellerle ölçülen doğrusal boyutlar için
DimensionBuilders.DpPropkullanın. - Derece cinsinden ölçülen açısal boyutlar için
DimensionBuilders.DegreesPropsimgesini kullanın. - Dize değerleri için
TypeBuilders.StringPropkullanın. - Renk değerleri için
ColorBuilders.ColorPropkullanın. - Kayan nokta değerleri için
TypeBuilders.FloatPropsimgesini kullanın.
Fiziksel boyutları etkileyen bir dinamik ifade kullandığınızda (renk hariç bir döşemedeki 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ındaki güncellemelerin 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 kutucukta az sayıda ifade kullanın.
Wear OS, tek bir kutucuğun sahip olabileceği ifadelerin sayısını sınırlar. Bir kutucuk çok fazla sayıda dinamik ifade içeriyorsa 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:
Döşemenizin durumunun farklı değerlerini temsil eden bir anahtar grubu 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") }
onTileRequest()uygulamanızdasetState()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() ) }
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örüntülemek içinanimate()işlevini de çağırabilirsiniz:val waterIntakeValue = DynamicBuilders.DynamicInt32.from(KEY_WATER_INTAKE)
Gerekirse durumu yeni değerlerle de güncelleyebilirsiniz. Bu, bir kutunun
LoadActionparçası olabilir.Bu örnekte, su alımı değeri
400olarak güncellenir:val loadAction = loadAction( dynamicDataMapOf( KEY_WATER_INTAKE mapTo 400, KEY_NOTE mapTo "Outstanding" ) )
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- ProtoLayout ad alanlarına geçiş
- Döşemeleri kullanmaya başlama
- Dikkat edilmesi gereken diğer noktalar