Ab Tiles 1.2 können Sie Plattformdaten-Updates mit dynamischen Ausdrücken streamen. Sie können diese Updates dann mit Animationen in Ihren Kacheln verknüpfen. Ihre App erhält jede Sekunde Updates für diesen Wert.
Mit dynamischen Ausdrücken müssen Sie nicht die gesamte Kachel aktualisieren, wenn sich ihr Inhalt ändert. Um die Kacheln ansprechender zu gestalten, können Sie diese dynamischen Objekte animieren.
Dynamische Ausdrücke mit Datenquellen verknüpfen
Die androidx.wear.protolayout und androidx.wear.protolayout.material
Namespaces enthalten viele Klassen, deren Felder dynamische Ausdrücke akzeptieren. Einige Beispiele:
- Mehrere Längenwerte, einschließlich der Länge eines
ArcObjekts und der Länge einesCircularProgressIndicatorObjekts. - Jede Farbe, z. B. die Inhaltsfarbe eines
ButtonObjekts. - Viele Stringwerte, einschließlich des Inhalts eines
TextObjekts, des Inhalts einesLayoutElementsBuilders.TextObjekts und der Inhaltsbeschreibung einesCircularProgressIndicatorObjekts.
Wenn Sie einen dynamischen Ausdruck als möglichen Wert für ein Element in Ihrer Kachel verwenden möchten, verwenden Sie den entsprechenden dynamischen Eigenschaftstyp *Prop des Elements und übergeben Sie die Datenquelle an die Methode setDynamicValue() der Builder-Klasse des dynamischen Eigenschaftstyps.
Tiles unterstützt die folgenden dynamischen Eigenschaftstypen:
- Für lineare Dimensionen, gemessen in anzeigunabhängigen Pixeln, verwenden Sie
DimensionBuilders.DpProp. - Für Winkeldimensionen, gemessen in Grad, verwenden Sie
DimensionBuilders.DegreesProp. - Für Stringwerte verwenden Sie
TypeBuilders.StringProp. - Für Farbwerte verwenden Sie
ColorBuilders.ColorProp. - Für Gleitkommawerte verwenden Sie
TypeBuilders.FloatProp.
Wenn Sie einen dynamischen Ausdruck verwenden, der sich auf physische Dimensionen auswirkt (jeder Wert in einer Kachel außer der Farbe), müssen Sie auch eine Reihe von zugehörigen Einschränkungen angeben, z. B. ein Stringformat. Mit diesen Einschränkungen kann der Systemrenderer den maximalen Platz bestimmen, den ein Wert in Ihrer Kachel einnehmen kann. Normalerweise geben Sie diese Einschränkungen auf Elementebene und nicht auf Ebene des dynamischen Ausdrucks an, indem Sie eine Methode aufrufen, die mit setLayoutConstraintsForDynamic* beginnt.
Das folgende Code-Snippet zeigt, wie Sie Updates für die Herzfrequenz mit drei Ziffern und einem Fallback-Wert von -- anzeigen:
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() )
Eine kleine Anzahl von Ausdrücken in einer einzelnen Kachel verwenden
In Wear OS ist die Anzahl der Ausdrücke begrenzt, die eine einzelne Kachel haben kann. Wenn eine Kachel zu viele dynamische Ausdrücke enthält, werden dynamische Werte ignoriert und das System greift auf die statischen Werte zurück, die Sie für die jeweiligen dynamischen Eigenschaftstypen angeben.
Dynamische Daten in einem Statusobjekt zusammenführen
Sie können die neuesten Updates aus Datenquellen in einem Status, den Sie an Ihre Kachel zur Wertdarstellung übergeben.
So verwenden Sie Statusinformationen in Ihren Kacheln:
Legen Sie eine Reihe von Schlüsseln fest, die die verschiedenen Werte des Status Ihrer Kachel darstellen. In diesem Beispiel werden Schlüssel für die Wasseraufnahme und eine „qqq“-Notiz erstellt:
companion object { val KEY_WATER_INTAKE = intAppDataKey("key_water_intake") val KEY_NOTE = stringAppDataKey("key_note") }
Rufen Sie in Ihrer Implementierung von
onTileRequest()die MethodesetState()auf und legen Sie die anfänglichen Zuordnungen von jedem Schlüssel zu einem bestimmten dynamischen Datenwert fest: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() ) }
Wenn Sie Ihr Layout erstellen, verwenden Sie an der Stelle, an der Sie diese Daten aus dem Status anzeigen möchten, ein
Dynamic*-Objekt. Sie können auchanimate()aufrufen, um eine Animation vom vorherigen zum aktuellen Wert anzuzeigen:val waterIntakeValue = DynamicBuilders.DynamicInt32.from(KEY_WATER_INTAKE)
Bei Bedarf können Sie den Status auch mit neuen Werten aktualisieren. Dies kann Teil einer Kachel
LoadActionsein.In diesem Beispiel wird der Wert für die Wasseraufnahme auf
400aktualisiert:val loadAction = loadAction( dynamicDataMapOf( KEY_WATER_INTAKE mapTo 400, KEY_NOTE mapTo "Outstanding" ) )
Empfehlungen für Sie
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist
- Zu ProtoLayout-Namespaces migrieren
- Erste Schritte mit Kacheln
- Weitere Überlegungen