הוספת משוב פיזי לאירועים

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

בדף הזה מתוארות שלוש דרכים לספק משוב מהותי.

השיטות האלה משתמשות בפרימיטיבים שמוגדרים ברמת המכשיר כדי לספק משוב באיכות גבוהה מותאם למכשיר הספציפי.

כברירת מחדל, כל השיטות של משוב הרטט מתייחסות להגדרות של משוב המגע של המשתמש.

שימוש ברכיבים של View כדי ליצור משוב פיזי

משתמשים ב-method‏ View.performHapticFeedback כדי ליצור משוב פיזי. המשתנים הקבועים של האפקט הרטטני שמוגדרים על ידי HapticFeedbackConstants מתמקדים בפונקציונליות שלהם באפליקציה, ולא בסוג האפקט הרטטני שמתבצע.

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

תנאים מוקדמים: הפעלת משוב פיזי

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

כדי להשבית את המשוב החזותי במכשיר Android View, מגדירים את המאפיין View.hapticFeedbackEnabled לערך false. השבתת המאפיין הזה תוביל למשוב ברירת המחדל.

השיטה performHapticFeedback מתייחסת גם להגדרת המערכת HAPTIC_FEEDBACK_ENABLED, שמאפשרת למשתמש להשבית אותם במערכת כולה.

בניגוד לממשקי API אחרים של משוב מגע, השימוש ב-HapticFeedbackConstants עם View לא מחייב את ההרשאה VIBRATE.

בוחרים HapticFeedbackConstant

כשמשתמשים ברכיבי View עם HapticFeedbackConstants, אין צורך להעריך את התמיכה במכשירים ספציפיים, כי למשתנים הקבועים האלה תהיה התנהגות חלופית במקרה הצורך. השיקול היחיד הוא רמת ה-SDK של הקבוע הרצוי.

דוגמה 1: הקשה על מקש

זוהי דוגמה לאופן שבו מוסיפים משוב מישוש לקלט מגע ב-View באמצעות רכיבי מעקב מגע. האפקטים מדמים את התחושה של לחיצה על לחצן ואז שחרור שלו.

Kotlin

class HapticTouchListener : View.OnTouchListener {
  override fun onTouch(View view, MotionEvent event) : Boolean {
    when (event.actionMasked) {
      MotionEvent.ACTION_DOWN ->
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
      MotionEvent.ACTION_UP ->
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE)
    }
    return true
  }
}

Java

class HapticTouchListener implements View.OnTouchListener {
  @Override
  public boolean onTouch(View view, MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
        break;
      case MotionEvent.ACTION_UP:
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE);
        break;
    }
    return true;
  }
}

דוגמה 2: כפתור שליחה

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

Kotlin

submitButton.setOnClickListener { view ->
  val successful = performSubmit()
  if (successful) {
    view.performHapticFeedback(HapticFeedbackConstants.CONFIRM)
  } else {
    view.performHapticFeedback(HapticFeedbackConstants.REJECT)
  }
}

Java

submitButton.setOnClickListener(view -> {
  boolean successful = performSubmit();
  if (successful) {
    view.performHapticFeedback(HapticFeedbackConstants.CONFIRM);
  } else {
    view.performHapticFeedback(HapticFeedbackConstants.REJECT);
  }
});

שימוש ב-VibrationEffect מוגדר מראש כדי ליצור משוב פיזי

הגישה שמבוססת על View מתמקדת באינטראקציה של המשתמש. מומלץ להשתמש בהם כדי לשמור על עקביות במערכת. עם זאת, אפשר גם להפעיל ממשקי VibrationEffect API מוגדרים מראש כדי ליצור אפקטים מותאמים אישית של משוב חישתי.

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

הסבר על תמיכה במכשירים בממשקי API של VibrationEffect

בשימוש בסיסי, אין צורך לבדוק אם יש תמיכה בממשקי API ספציפיים של VibrationEffect. ממשקי ה-API, כמו Vibrator.areEffectsSupported ו-Vibrator.areAllEffectsSupported, משמשים לקביעת אם במכשיר יש הטמעה בהתאמה אישית של הקבוע. אם אפקט מותאם אישית לא קיים, האפליקציה עדיין יכולה להפעיל את האפקטים ולהשתמש בהטמעת חלופי מוגדרת-פלטפורמה.

פרטים נוספים זמינים במאמר VibrationEffect מוגדר מראש.

דרישות מוקדמות: צריך לטעון את הרטט ואת ההרשאה VIBRATE

אפשר להפעיל את רוב הרטט באמצעות השירות Vibrator, שאפשר לטעון באופן הבא:

Kotlin

import android.os.Vibrator

val vibrator = context.getSystemService(Vibrator::class.java)

Java

import android.os.Vibrator;

Vibrator vibrator = context.getSystemService(Vibrator.class);

כדי שהאפליקציה תוכל להפעיל את הרטט במכשיר באמצעות השירות הזה, נדרשת לה ההרשאה VIBRATE. אפשר להוסיף את ההרשאה לקובץ המניפסט של האפליקציה:

<uses-permission android:name="android.permission.VIBRATE"/>

הפעלת VibrationEffect מוגדר מראש

אפשר להכין אפקטים מוגדרים מראש באמצעות VibrationEffect.createPredefined, ואז להפעיל אותם באמצעות אחת מהשיטות vibrate ב-Vibrator.

בדוגמה הזו מופעל אפקט Click.

Kotlin

val vibrator = context.getSystemService(Vibrator::class.java)
...
// Requires VIBRATE permission
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))

Java

Vibrator vibrator = context.getSystemService(Vibrator.class);
...
// Requires VIBRATE permission
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));

שימוש בקומפוזיציות מתקדמות עם פרימיטיבים

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

מידע נוסף על השימוש בממשקי ה-API האלה זמין במאמר יצירת אפקטים של משוב מגע בהתאמה אישית.