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

החל מגרסה 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. מגדירים קבוצה של מקשים שמייצגים את הערכים השונים של מצב האריח. בדוגמה הזו נוצרים מפתחות לצריכת מים ולפתק qqq:

    companion object {
        val KEY_WATER_INTAKE = intAppDataKey("key_water_intake")
        val KEY_NOTE = stringAppDataKey("key_note")
    }

  2. בהטמעה של onTileRequest(), קוראים ל-setState() ומגדירים מיפויים ראשוניים מכל מפתח לערך נתונים דינמי מסוים:

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

    val waterIntakeValue =
        DynamicBuilders.DynamicInt32.from(KEY_WATER_INTAKE)

  4. במקרה הצורך, אפשר גם לעדכן את המצב עם ערכים חדשים. הוא יכול להיות חלק מLoadAction של משבצת.

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

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