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

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

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

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

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

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

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

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

דרישות מוקדמות: הפעלת משוב פיזי

כל עוד 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-based מתמקדת באינטראקציה של המשתמשים, ולכן מומלץ להשתמש בה כדי לשמור על עקביות במערכת. עם זאת, אפשר גם להפעיל ממשקי API ספציפיים של VibrationEffect מוגדרים מראש כדי ליצור אפקטים מותאמים אישית של משוב הפטי.

אפקטים מוגדרים מראש זמינים כ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.

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

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));

איך יוצרים קומפוזיציות באמצעות VibrationEffect.Builder

החל מ-Android 16 (רבעון 4 של 2026), ממשק VibrationEffect.Builder API מציע את הדרך הכי גמישה ונוחה ליצור משוב הפטי בהתאמה אישית, על ידי יצירת רצף של הגדרות קבועות מראש, מעטפות ואלמנטים אחרים של רטט לאורך ציר זמן. בנוסף, לקומפוזיציות שנוצרו באמצעות VibrationEffect.Builder יש תמיכה אוטומטית מובנית בגיבוי בכל האלמנטים הנתמכים שלהן.

במאמר יצירת אפקטים הפטיים מותאמים אישית יש הסבר מפורט יותר על יצירת אפקטים הפטיים באמצעות VibrationEffect.Builder (ו-API‏ VibrationEffect.Composition).