ב-WFF נעשה שימוש בשפת ביטוי כדי לאפשר:
- שינוי המראה באמצעות
TransformאוGyro - התנהגות מותנית באמצעות הצהרות
Condition - עיצוב מחרוזות ברכיבי
Template
שפת הביטוי היא שפת סקריפט שמכילה את האופרטורים הרגילים ומגוון פונקציות שאפשר להשתמש בהן.
ביטויים יכולים להשתמש במקורות נתונים – שמיוצגים באמצעות סוגריים מרובעים – כדי לאפשר לכם להגיב לקלט חיצוני כמו התאריך והשעה הנוכחיים, מדדי בריאות וכושר או אפילו מזג האוויר.
כשמשתמשים בביטויים, ההבדל העיקרי בין השימוש ב-Transform, ב-Template וב-Condition הוא שב-Transform וב-Template הביטוי צריך להניב ערך (לדוגמה, המיקום החדש של רכיב התג הסוגר), ואילו ב-Condition הביטוי צריך להניב ערך בוליאני.
כשמשתמשים בו ברכיב Condition, מציינים את הביטוי כרכיב טקסט. כדי להימנע משימוש בהפניות לישויות, כמו " ו-&, צריך להוסיף את הביטוי לתג CDATA.
<![CDATA[[DAY_OF_WEEK] == 6 || [DAY_OF_WEEK] == 7]]>
הפונקציה מחזירה ערך בוליאני וקובעת אם התאריך הוא סוף שבוע או לא, באמצעות מקור הנתונים DAY_OF_WEEK.
יש גם תמיכה בפונקציות – לדוגמה, ביטוי לסיבוב ערך עד 5 מעלות לכל כיוון – על סמך x-value של מד התאוצה במכשיר Wear OS:
(5.0/90.0)*clamp([ACCELEROMETER_ANGLE_X],0,90) + (-5.0/90.0)*clamp([ACCELEROMETER_ANGLE_X],-90,0)
הפונקציה clamp() מגבילה ערך בין שני גבולות.
הערכה מחדש של ביטוי
התדירות שבה המערכת מעריכה מחדש ביטויים תלויה במקורות הנתונים שבהם נעשה שימוש בביטויים. לדוגמה, הביטוי [DAY_OF_WEEK] == 6 || [DAY_OF_WEEK] == 7 עובר הערכה מחדש רק כשמתחיל יום חדש. לעומת זאת, ביטוי שמשתמש במקור הנתונים [SECOND] עובר הערכה מחדש כל שנייה.
הערכה מחדש עשויה לגרום לחישובים מחדש של סצנות ולרינדור מחדש, בהתאם לשינוי בתוצאה של הביטוי. לכן חשוב להשתמש תמיד במקורות נתונים שמתבצעת בהם הערכה מחדש בתדירות הנמוכה ביותר האפשרית. לדוגמה, כדי לקבוע אם השעה היא אחר הצהריים:
<!-- BAD: Re-evaluates every second --> [SECONDS_IN_DAY] > 43200
<!-- Good: Minimizes re-evaluation (1 = PM, 0 = AM) --> [AMPM_STATE] == 1
ערכי הגדרה בביטויים
בנוסף לפונקציות ולמקורות נתונים, אפשר להשתמש בערכי הגדרה. לדוגמה, אם ב-UserConfigurations הוגדר BooleanConfiguration בשם showBackgroundInAfternoon, אפשר להשתמש בו בביטוי:
<![CDATA[[CONFIGURATION.showBackgroundInAfternoon] == "TRUE" && [AMPM_STATE] == 1]]>