החל מגרסה 1.2 של Tiles, אפשר להעביר (לסטרימינג) עדכונים של נתוני פלטפורמה באמצעות ביטויים דינמיים. לאחר מכן תוכלו לשייך את העדכונים האלה לאנימציות בכרטיסי המידע. האפליקציה מקבלת עדכונים של הערך הזה בכל שנייה.
כשמשתמשים בביטויים דינמיים, אין צורך לרענן את כל המשבצת כשהתוכן שלה משתנה. כדי ליצור חוויה מעניינת יותר במשבצות, כדאי להוסיף להן אנימציה.
שיוך של ביטויים דינמיים למקורות נתונים
מרחבי השמות androidx.wear.protolayout
ו-androidx.wear.protolayout.material
מכילים הרבה כיתות שהשדות שלהן מקבלים ביטויים דינמיים.
דוגמאות:
- מספר ערכים של אורך, כולל אורך של אובייקט
Arc
ואורך של אובייקטCircularProgressIndicator
. - כל צבע, למשל צבע התוכן של אובייקט
Button
. - ערכים רבים של מחרוזות, כולל התוכן של אובייקט
Text
, התוכן של אובייקטLayoutElementsBuilders.Text
ותיאור התוכן של אובייקטCircularProgressIndicator
.
כדי להשתמש בביטוי דינמי כערך אפשרי של רכיב באריח, משתמשים בסוג המאפיין הדינמי התואם *Prop
של הרכיב ומעבירים את מקור הנתונים לשיטה setDynamicValue()
של סוג המאפיין הדינמי.
המשבצות תומכות בסוגי הנכסים הדינמיים הבאים:
- למאפיינים לינאריים, שנמדדים בפיקסלים שאינם תלויים במסך, משתמשים ב-
DimensionBuilders.DpProp
. - למאפיינים זוויתיים, שנמדדים במעלות, משתמשים ב-
DimensionBuilders.DegreesProp
. - לערכי מחרוזת, משתמשים ב-
TypeBuilders.StringProp
. - לערכים של צבעים, משתמשים ב-
ColorBuilders.ColorProp
. - לערכים של נקודה צפה, משתמשים ב-
TypeBuilders.FloatProp
.
כשמשתמשים בביטוי דינמי שמשפיע על המאפיינים הפיזיים – כל ערך באריח מלבד הצבע – צריך לציין גם קבוצה של אילוצים קשורים, כמו פורמט מחרוזת. האילוצים האלה מאפשרים למעבד הגרפיקה של המערכת לקבוע את נפח האחסון המקסימלי שיכול להיות לערכים בתוך המשבצת. בדרך כלל, מציינים את האילוצים האלה ברמת הרכיב, ולא ברמת הביטוי הדינמי, על ידי קריאה לשיטה שמתחילה ב-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 מוגבל מספר הביטויים שאפשר להציג בכרטיס יחיד. אם משבצת מכילה יותר מדי ביטויים דינמיים בסך הכול, המערכת תתעלם מהערכים הדינמיים ותשתמש בערכים הסטטיים שסיפקתם לסוגי הנכסים הדינמיים הרלוונטיים.
איחוד נתונים דינמיים באובייקט מצב
אתם יכולים לאחד את קבוצת העדכונים האחרונה ממקורות הנתונים למצב, ולהעביר אותו לכרטיס לצורך עיבוד הערכים.
כדי להשתמש בנתוני המצב בכרטיסיות:
מגדירים קבוצת מפתחות שמייצגים את הערכים השונים של מצב המשבצת. בדוגמה הזו נוצרים מפתחות לצריכת מים ולערה:
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");
בהטמעה של
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() ); }
כשיוצרים את הפריסה, במקום שבו רוצים להציג את הנתונים האלה מהמצב, משתמשים באובייקט מסוג
Dynamic*
. אפשר גם להפעיל אתanimate()
כדי להציג אנימציה מהערך הקודם לערך הנוכחי:Kotlin
DynamicInt32.from(KEY_WATER_INTAKE).animate()
Java
DynamicInt32.from(KEY_WATER_INTAKE).animate();
במקרה הצורך, אפשר גם לעדכן את המצב בערכים חדשים. הוא יכול להיות חלק מ
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();
מומלץ עבורך
- הערה: טקסט הקישור מוצג כש-JavaScript מושבת
- מעבר למרחבי שמות של ProtoLayout
- תחילת העבודה עם משבצות
- שיקולים נוספים