שימוש בתנועות על פרק כף היד ב-Wear

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

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

  • באפליקציית ריצה, ניווט בין מסכים אנכיים שמוצגים הצעדים שננקטו, הזמן שחלף והקצב הנוכחי
  • באפליקציית נסיעות, גוללים בין פרטי הטיסות והשערים
  • גלילה בין כתבות באפליקציית חדשות

כדי לבדוק את התנועות של פרק כף היד בשעון במכשיר, מוודאים שהתנועות מופעלת על ידי בחירה באפשרות הגדרות > תכונות מתקדמות > תנועות > תנועות של פרק כף היד מופעל. לאחר מכן משלימים את מדריך לתנועות בשעון על ידי בחירה באפשרות הפעלת המדריך.

הערה: ניעור פרק כף היד הוא פעולת חזרה או ביטול של כל המערכת והוא לא זמין לאפליקציות להתאמה אישית.

ניתן להשתמש בתנועות של פרק כף היד בדרכים הבאות, כפי שמתואר במדריך הזה:

כל תנועה של פרק כף היד ממופה הקבועה int KeyEvent הכיתה, כפי שמוצג בטבלה הבאה:

תנועה אירוע מרכזי תיאור
תנועה של פרק כף היד החוצה KEYCODE_NAVIGATE_NEXT קוד המפתח הזה מיועד לפריט הבא.
תנועה של פרק כף היד פנימה KEYCODE_NAVIGATE_PREVIOUS קוד המפתח הזה מיועד לפריט הקודם.

שימוש בפריסה מעוקלת כדי לתמוך בתנועות על פרק כף היד

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

הערה: המחלקה WearableRecyclerView מחליפה מחלקה דומה, הוצא משימוש בספריית התמיכה של מכשירים לבישים.

גם אם משתמשים ב-WearableRecyclerView, כדאי להשתמש קבועים מ-KeyEvent בכיתה. אפשר לבטל את הפעולות המוגדרות מראש על ידי סיווג המשנה של WearableRecyclerView והטמעה מחדש של התקשרות חזרה onKeyDown(). אפשר להשבית לגמרי את ההתנהגות הזו באמצעות setEnableGestureNavigation(false). מידע נוסף זמין במאמר הבא: ביצוע פעולות במקלדת.

שימוש באירועים מרכזיים באופן ישיר

אפשר להשתמש באירועים מרכזיים מחוץ ל- WearableRecyclerView כדי להפעיל פעולות חדשות בתגובה לתנועה אירועים. חשוב לציין שאירועי התנועה האלה מזוהים כשהמכשיר נמצא במצב פעיל, והם נשלחים בדיוק כמו כל האירועים המרכזיים.

סיווג שקשורה לאינטראקציה של משתמשים, כמו View או Activity, וההטמעה מתבצעת לשירות KeyEvent.Callback יש הרשאה להאזין לאירועים מרכזיים שקשורים תנועה על פרק כף היד בדיוק כמו שהיא יכולה להופיע בכל אירוע מרכזי אחר. מסגרת Android קוראת לפונקציה View או Activity שיש בה להתמקד באירועים המרכזיים. לתנועות, onKeyDown() הקריאה החוזרת (callback) של ה-method מופעלת כאשר תנועות מופיעות.

לדוגמה, אפליקציה יכולה לבטל פעולות שהוגדרו מראש בקובץ View או Activity עם KeyEvent.Callback באופן הבא:

Kotlin

class GesturesActivity : Activity() {

    /* KeyEvent.Callback */
    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        return when (keyCode) {
            KeyEvent.KEYCODE_NAVIGATE_NEXT ->
                // Do something that advances a user View to the next item in an ordered list.
                moveToNextItem()
            KeyEvent.KEYCODE_NAVIGATE_PREVIOUS ->
                // Do something that advances a user View to the previous item in an ordered list.
                moveToPreviousItem()
            else -> {
                // If you did not handle it, let it be handled by the next possible element as determined
                // by the Activity.
                super.onKeyDown(keyCode, event)
            }
        }
    }

    /** Shows the next item in the custom list.  */
    private fun moveToNextItem(): Boolean {
        ...
        // Return true if handled successfully, otherwise return false.
        return false
    }

    /** Shows the previous item in the custom list.  */
    private fun moveToPreviousItem(): Boolean {
        ...
        // Return true if handled successfully, otherwise return false.
        return false
    }
}

Java

public final class GesturesActivity extends Activity {

 @Override /* KeyEvent.Callback */
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  switch (keyCode) {
   case KeyEvent.KEYCODE_NAVIGATE_NEXT:
    // Do something that advances a user View to the next item in an ordered list.
    return moveToNextItem();
   case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:
    // Do something that advances a user View to the previous item in an ordered list.
    return moveToPreviousItem();
  }
  // If you did not handle it, let it be handled by the next possible element as determined by the Activity.
  return super.onKeyDown(keyCode, event);
 }

 /** Shows the next item in the custom list. */
 private boolean moveToNextItem() {
  boolean handled = false;
  ...
  // Return true if handled successfully, otherwise return false.
  return handled;
 }

 /** Shows the previous item in the custom list. */
 private boolean moveToPreviousItem() {
  boolean handled = false;
  ...
  // Return true if handled successfully, otherwise return false.
  return handled;
 }
}

שיטות מומלצות

  • מומלץ לעיין בKeyEvent ו- KeyEvent.Callback דפים להעברה של אירועים מרכזיים אל View ו-Activity.
  • הקפדה על כיוון עקבי: אפשר להשתמש ב'שחרור פרק כף היד' עבור Next ו-"fהישג פרק כף היד פנימה" לפריט הקודם.
  • כדאי להשתמש במקביל במגע כדי לבצע תנועה.
  • שליחת משוב חזותי.
  • אל תשתמשו בקוד מפתח כדי להטמיע פונקציונליות בניגוד לציפיות של שאר המערכת. לדוגמה, אל תשתמשו KEYCODE_NAVIGATE_NEXT כדי לבטל פעולה או לעבור אל ציר עם תנועות שמאלה-ימינה.
  • לא מיירטים את האירועים המרכזיים באלמנטים שהם לא חלק בממשק משתמש, כמו צפיות שאינן מופיעות במסך או באופן חלקי בסרטון הזה. ההגדרה הזו זהה למקרה של כל אירוע מרכזי.
  • אל תפרשו מחדש תנועות סיבוביות חוזרות ונשנות כמחווה חדשה משלכם. מצב כזה עלול להתנגש עם "רעידת פרק כף היד" של המערכת תנועה.
  • כדי שתצוגה מפורטת תקבל אירועים מרכזיים מסוג תנועות, היא צריכה לכלול Focus; להצגת View.setFocusable().

    מכיוון שתנועות נחשבות לאירועים מרכזיים, הם מבצעים מעבר מ'מצב מגע' עשויה לגרום דברים. מכיוון שהמשתמשים עשויים לעבור בין שימוש במגע תנועות, ייתכן שיש צורך בשיטה View::setFocusableInTouchmode(). בחלק מהמקרים במקרים מסוימים, צריך גם להשתמש setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS) כך שכאשר המיקוד משתנה לאחר שינוי למצב מגע או ממנו, מקבל את המיקוד.

  • שימוש ב-requestFocus() וב clearFocus() בזהירות:
    • בשיחה אל requestFocus(), צריך לוודא שהוא מתאים כדי להתמקד. אם התצוגה לא מופיעה במסך או מופיעה בתצוגה אחרת, יכולות להתרחש הפתעות כשתנועות מפעילות קריאה חוזרת.
    • השיטה clearFocus() מתחילה חיפוש ממוקד כדי למצוא מודל אחר לתצוגה המתאימה. בהתאם להיררכיית התצוגות, החיפוש מחייבות חישוב לא טריוויאלי. הוא עשוי גם להקצות התמקדות לתצוגה שלא מצפה לכם להתמקד בה.
  • האירועים המרכזיים מועברים קודם לתצוגה, כשהמיקוד הוא בתצוגה ההיררכיה. אם התצוגה שמתמקדת לא מטפלת באירוע, כלומר, היא מחזירה false – האירוע לא מועבר לתצוגת ההורה, גם לא אם הוא יכול להתמקד כשיש KeyListener. במקום זאת, האירוע מועבר לפעילות הנוכחית החזקת היררכיית התצוגות תוך התמקדות.

    לכן, ייתכן שיהיה צורך לאתר את כל האירועים ברמה גבוהה יותר, ולאחר מכן להעביר את הקודים הרלוונטיים. לחלופין, אפשר ליצור מחלקה משנית של הפעילות ולבטל את ההגדרה שיטה אחת ( dispatchKeyEvent(KeyEvent event)) ליירוט מפתחות במקרה הצורך, או יטפל בהם כאשר לא מטופלים בשכבות התחתונות.