Dynamische Updates in Kacheln anzeigen

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:

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:

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:

  1. 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")
    }

  2. Rufen Sie in Ihrer Implementierung von onTileRequest() die Methode setState() 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()
        )
    }

  3. 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 auch animate() aufrufen, um eine Animation vom vorherigen zum aktuellen Wert anzuzeigen:

    val waterIntakeValue =
        DynamicBuilders.DynamicInt32.from(KEY_WATER_INTAKE)

  4. 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 400 aktualisiert:

    val loadAction =
        loadAction(
            dynamicDataMapOf(
                KEY_WATER_INTAKE mapTo 400,
                KEY_NOTE mapTo "Outstanding"
            )
        )