הצגת עדכונים דינמיים במשבצות

החל מגרסה 1.2 של Tiles, אפשר להעביר (לסטרימינג) עדכונים של נתוני פלטפורמה באמצעות ביטויים דינמיים. לאחר מכן תוכלו לשייך את העדכונים האלה לאנימציות בכרטיסי המידע. האפליקציה מקבלת עדכונים של הערך הזה בכל שנייה.

כשמשתמשים בביטויים דינמיים, אין צורך לרענן את כל המשבצת כשהתוכן שלה משתנה. כדי ליצור חוויה מעניינת יותר במשבצות, כדאי להוסיף להן אנימציה.

שיוך של ביטויים דינמיים למקורות נתונים

מרחבי השמות androidx.wear.protolayout ו-androidx.wear.protolayout.material מכילים הרבה כיתות שהשדות שלהן מקבלים ביטויים דינמיים. דוגמאות:

כדי להשתמש בביטוי דינמי כערך אפשרי של רכיב באריח, משתמשים בסוג המאפיין הדינמי התואם *Prop של הרכיב ומעבירים את מקור הנתונים לשיטה setDynamicValue() של סוג המאפיין הדינמי.

המשבצות תומכות בסוגי הנכסים הדינמיים הבאים:

כשמשתמשים בביטוי דינמי שמשפיע על המאפיינים הפיזיים – כל ערך באריח מלבד הצבע – צריך לציין גם קבוצה של אילוצים קשורים, כמו פורמט מחרוזת. האילוצים האלה מאפשרים למעבד הגרפיקה של המערכת לקבוע את נפח האחסון המקסימלי שיכול להיות לערכים בתוך המשבצת. בדרך כלל, מציינים את האילוצים האלה ברמת הרכיב, ולא ברמת הביטוי הדינמי, על ידי קריאה לשיטה שמתחילה ב-setLayoutConstraintsForDynamic*.

קטע הקוד הבא מראה איך להציג עדכונים של קצב הלב באמצעות 3 ספרות, עם ערך חלופי של --:

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()
    )

שימוש במספר קטן של ביטויים בתוך משבצת אחת

ב-Wear OS מוגבל מספר הביטויים שאפשר להציג בכרטיס יחיד. אם משבצת מכילה יותר מדי ביטויים דינמיים בסך הכול, המערכת תתעלם מהערכים הדינמיים ותשתמש בערכים הסטטיים שסיפקתם לסוגי הנכסים הדינמיים הרלוונטיים.

איחוד נתונים דינמיים באובייקט מצב

אתם יכולים לאחד את קבוצת העדכונים האחרונה ממקורות הנתונים למצב, ולהעביר אותו לכרטיס לצורך עיבוד הערכים.

כדי להשתמש בנתוני המצב בכרטיסיות:

  1. מגדירים קבוצת מפתחות שמייצגים את הערכים השונים של מצב המשבצת. בדוגמה הזו נוצרים מפתחות לצריכת מים ולערה:

    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");
  2. בהטמעה של onTileRequest(), קוראים ל-setState() ומגדירים מיפויים ראשוניים מכל מפתח לערך נתונים דינמי מסוים:

    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()
        );
    }
  3. כשיוצרים את הפריסה, במקום שבו רוצים להציג את הנתונים האלה מהמצב, משתמשים באובייקט מסוג Dynamic*. אפשר גם להפעיל את animate() כדי להציג אנימציה מהערך הקודם לערך הנוכחי:

    Kotlin

    DynamicInt32.from(KEY_WATER_INTAKE).animate()

    Java

    DynamicInt32.from(KEY_WATER_INTAKE).animate();
  4. במקרה הצורך, אפשר גם לעדכן את המצב בערכים חדשים. הוא יכול להיות חלק מLoadAction של המשבצת.

    בדוגמה הזו, הערך של צריכת המים מתעדכן ל-400:

    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();