בקטע הזה מוסבר על ממשקי ה-API השונים של תחושות מישוש שזמינים ב-Android. בנוסף, מוסבר מתי ואיך לבדוק אם יש תמיכה במכשיר כדי לוודא שהאפקטים ההפטיים פועלים כמו שרוצים.
יש כמה דרכים שונות ליצור אפקטים של משוב מישוש, וחשוב להביא בחשבון את עקרונות העיצוב של משוב מישוש ב-Android כשבוחרים ביניהם. בטבלה הבאה מסוכמים המאפיינים הכלליים של כל אחת מהגישות:
- הזמינות חשובה במיוחד כשמתכננים חזרה להתנהגות ברירת המחדל, וצריך לשלב אותה עם בדיקת התמיכה במכשיר ספציפי.
- תחושות מישוש ברורות הן תחושות חדות ונקיות שלא מפריעות למשתמשים.
- תחושות מישוש עשירות מאפשרות הבעה רחבה יותר, ולרוב נדרש עבורן חומרה עם יותר תכונות.
| פלטפורמת ה-API | זמינות | הסרת המשוב הפיזי | משוב פיזי עשיר |
|---|---|---|---|
| HapticFeedbackConstants | Android 1.5 ואילך (לכל קבוע) |
||
| Predefined VibrationEffect | Android 10 ואילך | ||
| VibrationEffect Composition | Android מגרסה 11 ואילך (לפי קבוע) | ||
| רטט הפעלה/השבתה, רטט חד-פעמי ורטט של צורת גל | Android 1 |
בנוסף, ממשקי ה-API להתראות, שמתוארים בדף הזה, מאפשרים לכם להתאים אישית את האפקטים של המשוב המישוש שמופעלים כשמתקבלות התראות.
בדף הזה מתוארים גם מושגים נוספים שרלוונטיים לכל ממשקי ה-API:
- האם במכשיר יש רטט?
- הגדרת עוצמת התנודות מאפשרת ליצור אפקטים של תנודות חלקים ועשירים יותר, אבל לא כל המכשירים תומכים בה.
-
VibrationAttributes()עוזרת לכם לסווג את הרטט לפי השימוש בו, כדי להבטיח שיוחלו עליו הגדרות המשתמש המתאימות וכך למנוע הפתעות למשתמש.
HapticFeedbackConstants
המחלקות HapticFeedbackConstants מספקות קבועים מבוססי-פעולה כדי לאפשר לאפליקציות להוסיף משוב הפטי שתואם לחוויית המשתמש במכשיר, במקום שכל אפליקציה תציג אפקטים שונים לפעולות נפוצות.
תאימות ודרישות
השימוש בשיטה View.performHapticFeedback עם הקבועים האלה לא דורש הרשאות מיוחדות לאפליקציה. הוא כפוף למאפיין View.hapticFeedbackEnabled, שאם הוא מוגדר ל-false, הוא משבית את כל הקריאות למשוב הפטי בתצוגה, כולל ברירות המחדל.ההגדרה העיקרית שקשורה לכך היא המאפיין View.hapticFeedbackEnabled, שאם הוא מוגדר ל-false, הוא משבית את כל הקריאות למשוב הפטי בתצוגה, כולל ברירות המחדל. השיטה גם מתחשבת בהגדרת המערכת של המשתמש להפעלת משוב מגע.
השיקול היחיד שקשור לתאימות הוא רמת ה-SDK של הקבוע הספציפי לפעולה.
אין צורך לספק התנהגות חלופית כשמשתמשים ב-HapticFeedbackConstants.
שימוש ב-HapticsFeedbackConstants
פרטים על השימוש ב-HapticFeedbackConstants זמינים במאמר הוספת משוב פיזי לאירועים.
מוגדר מראש VibrationEffect
המחלקה VibrationEffect מספקת כמה קבועים מוגדרים מראש, כמו CLICK, TICK ו-DOUBLE_CLICK. יכול להיות שהאפקטים האלה יעברו אופטימיזציה למכשיר.
תאימות ודרישות
כדי להפעיל את VibrationEffect, נדרשת ההרשאה VIBRATE במניפסט של האפליקציה.
אין צורך לספק התנהגות חלופית כשמשתמשים ב-VibrationEffect שהוגדר מראש, כי קבועים שלא הוטמעו בצורה אופטימלית למכשיר חוזרים לברירת מחדל רגילה של הפלטפורמה.
ממשקי ה-API Vibrator.areEffectsSupported ו-Vibrator.areAllEffectsSupported
משמשים כדי לקבוע אם יש הטמעה שעברה אופטימיזציה למכשיר.
עדיין אפשר להשתמש באפקטים מוגדרים מראש בלי הטמעה אופטימלית, והמערכת משתמשת בחזרה לערך ברירת המחדל של הפלטפורמה. לכן, ממשקי ה-API האלה, areEffectsSupported, נדרשים רק אם האפליקציה רוצה לקחת בחשבון אם האפקט מותאם למכשיר או לא.
השיטות לבדיקת האפקט יכולות להחזיר אחד משלושת הערכים הבאים:
-
VIBRATION_EFFECT_SUPPORT_YESמציין שהמכשיר כולל תמיכה אופטימלית באפקט הזה. -
VIBRATION_EFFECT_SUPPORT_NOמציין שלמכשיר אין תמיכה אופטימלית, אבל הוא עדיין משתמש בחלופה של הפלטפורמה. -
VIBRATION_EFFECT_SUPPORT_UNKNOWNמציין שהמערכת לא יודעת אם ההטמעה עברה אופטימיזציה או לא.
הערך UNKNOWN מציין שה-API לבדיקה לא זמין, ולכן הוא מוחזר בדרך כלל לכל האפקטים או לאף אחד מהם. המכשירים האלה עוברים באופן דינמי לגרסה קודמת.
שימוש ב-VibrationEffect שהוגדרו מראש
לפרטים על שימוש ב-VibrationEffect מוגדר מראש, אפשר לעיין במאמר שימוש ב-VibrationEffect מוגדר מראש ליצירת משוב הפטי.
Envelope VibrationEffect
רטט מבוסס-מעטפת מאפשר שליטה מדויקת במשרעת ובתדירות של הרטט לאורך זמן, על ידי הגדרה של רצף נקודות בקרה. כך מפתחים יכולים ליצור חוויות עשירות ומורכבות יותר של משוב הפטי. אפשר ליצור את הרטטים האלה באמצעות המחלקות BasicEnvelopeBuilder ו-WaveformEnvelopeBuilder.
תאימות ודרישות
כדי להפעיל אפקטים של רטט, האפליקציה צריכה להצהיר על ההרשאה VIBRATE במניפסט של האפליקציה.
כדי לבדוק אם יש תמיכה באפקטים של מעטפות, מתקשרים אל Vibrator.areEnvelopeEffectsSupported().
Basic Envelope Builder
כדי ליצור חוויה חלקה ורציפה של משוב הפטי, אפקטים של מעטפת צריכים להתחיל ולהסתיים בעוצמה של \( 0.0 \). ה-API אוכף את זה על ידי הגדרת עוצמת ההתחלה לאפס, וזורק חריגה אם עוצמת הסיום לא אפס. המגבלה הזו מונעת אפקטים דינמיים לא רצויים ברעידות, בגלל אי-רציפות במשרעת שיכולה להשפיע לרעה על התפיסה המישושית של המשתמש.
כדי לספק עיבוד עקבי של אפקט המעטפה בכל המכשירים, נדרש שהמכשירים שתומכים בתכונה הזו יוכלו לטפל במשך מינימלי של 20 אלפיות השנייה בין נקודות הבקרה, ולפחות ב-16 נקודות לאפקטים של מעטפות.
כלי ליצירת מעטפת של צורת גל
המסגרת לא משנה את ערכי התדירות והאמפליטודה המבוקשים שמסופקים על ידי המפתח. עם זאת, ה-API גם מתקן את אמפליטודת ההתחלה לאפס כדי ליצור מעברים חלקים.
כדי לעזור לכם לבצע אופטימיזציה של אפקטים של מעטפת צורת גל באפליקציה ולספק תאימות בין מכשירים, מערכת Android מספקת ממשקי API לשליחת שאילתות לגבי יכולות חשובות של המכשיר. השיטות האלה מספקות מידע על המגבלות של המכשיר, כמו משך המעבר המקסימלי והמינימלי בין נקודות בקרה ומספר נקודות הבקרה המקסימלי שנתמך עבור אפקט יחיד:
getMaxSize()- מאחזר את המספר המקסימלי של נקודות בקרה שנתמכות עבור אפקט של מעטפה.
getMinControlPointDurationMillis()- מאחזר את משך הזמן המינימלי הנתמך, באלפיות השנייה, בין שתי נקודות בקרה באפקט של מעטפת.
getMaxControlPointDurationMillis()- מאחזר את משך הזמן המקסימלי שנתמך, באלפיות השנייה, בין שתי נקודות בקרה במסגרת אפקט מעטפה.
getMaxDurationMillis()
- Retrieves the maximum duration supported for an envelope effect, in milliseconds.
אם אפקט חורג מהמגבלות של המכשיר – למשל אם הוא מאפשר יותר מדי נקודות בקרה או משך זמן שחורג מהמקסימום – המסגרת מתאימה את האפקט באופן אוטומטי כדי שלא יחרוג מהגבולות המותרים. תהליך ההתאמה הזה מנסה לשמר את הכוונה המקורית ואת התחושה של העיצוב ככל האפשר.
שימוש באפקטים של רטט במעטפה
פרטים על יצירת אפקטים של צורת גל של מעטפת זמינים במאמר בנושא יצירת צורת גל של רטט באמצעות מעטפות.
יצירה מוזיקלית VibrationEffect
קומפוזיציה של VibrationEffect היא אפקט של רטט שנוצר באמצעות API VibrationEffect.startComposition. ממשק ה-API הזה מאפשר ליצור תחושות מישוש עשירות על ידי יצירת רצף של פרימיטיבים עם עיכובים ועוצמות מותאמים אישית. עם זאת, חשוב לוודא שהמכשיר תומך בתכונות שמשולבות כדי למנוע חוויה לא עקבית.
תאימות ודרישות
כדי להפעיל את VibrationEffect, נדרשת ההרשאה VIBRATE במניפסט של האפליקציה.
לא כל המכשירים תומכים בכל התכונות של Composition API, ולכן חשוב לוודא שהפרימיטיבים זמינים.
בדיקה אם יש תמיכה בפרימיטיבים של רטט
אפשר לאחזר את התמיכה בכל פרימיטיב באמצעות השיטה Vibrator.arePrimitivesSupported. לחלופין, אפשר לבדוק כמה פרימיטיבים ביחד באמצעות השיטה Vibrator.areAllPrimitivesSupported. זה שווה ערך לשימוש ב-AND כדי לבדוק את התמיכה בכל פרימיטיב.
שימוש ב-VibrationEffect קומפוזיציות
פרטים על השימוש בVibrationEffect קומפוזיציות זמינים במאמר יצירת קומפוזיציות של רטט.
רטט עם הפעלה והשבתה, רטט חד-פעמי ורטט של צורת גל
הצורה הכי ישנה של רטט שנתמכת ב-Android היא דפוסי הפעלה והשבתה פשוטים של רטט עם משכי זמן שניתנים להגדרה. בדרך כלל, ממשקי ה-API האלה לא מתאימים לעקרונות העיצוב של אפקטים הפטיים, כי הם יכולים ליצור אפקטים הפטיים רוטטים. כדאי להימנע מהם, אלא אם אין ברירה אחרת.
התרחיש לדוגמה הנפוץ ביותר לשימוש ברטט עם מצב הפעלה ומצב השבתה הוא התראות, שבהן רצוי שיהיה רטט כלשהו, לא משנה מה. רטט של צורת גל מאפשר גם הוא חזרה אינסופית של תבנית, כמו שאפשר לדמיין עבור צלצול.
דפוס חד-פעמי מתייחס לרטט אחד למשך N אלפיות השנייה.
יש שני סוגים של דפוסי צורת גל:
- רק תזמונים. צורת הגל הזו היא תיאור של משכי זמן לסירוגין שבהם המכשיר כבוי, ומשכי זמן שבהם הוא פועל. התזמונים מתחילים עם משך הזמן שבו המכשיר כבוי. לכן, דפוסי צורת הגל מתחילים לעיתים קרובות עם ערך אפס כדי לציין שהמכשיר צריך להתחיל לרטוט באופן מיידי.
- תזמונים ואמפליטודות. לצורת גל כזו יש מערך נוסף של אמפליטודות שתואם לכל נתון תזמון, ולא רק מצב מרומז של הפעלה או השבתה כמו בצורה הראשונה. עם זאת, חשוב לבדוק שהמכשיר תומך בשליטה בעוצמת הקול כדי לוודא שאפשר להשיג את ההתאמה הרצויה.
תאימות ודרישות
רטט עם מצב מופעל/מושבת הוא הצורה הכי ישנה של רטט, ולכן יש תמיכה בו כמעט בכל המכשירים עם מנגנון רטט, כפי שמתואר בהמשך הדף הזה.
כדי להפעיל שיחות VibrationEffect או שיחות בסגנון הישן של vibrate, צריך להגדיר את ההרשאה VIBRATE במניפסט של האפליקציה.
כשמשתמשים בערכי אמפליטודה שונים בצורת גל, מומלץ מאוד לוודא שהמכשיר תומך בשליטה באמפליטודה.
בדיקה אם יש תמיכה בבקרה על עוצמת הקול
ערכי אמפליטודה שאינם אפס מעוגלים כלפי מעלה ל-100% במכשירים ללא שליטה באמפליטודה, ולכן חשוב לבדוק אם התמיכה קיימת באמצעות Vibrator.hasAmplitudeControl. פרטים נוספים זמינים במאמר בנושא שליטה בעוצמת הקול.
חשוב לשקול היטב אם האפקט שלכם איכותי מספיק ללא שליטה בעוצמת האות. יכול להיות שעדיף להשתמש ברטט שמופעל ומושבת באופן מפורש.
שימוש ברטט לסירוגין
ברמות חדשות יותר של SDK, כל מצבי הרטט אוחדו לקטגוריה אחת של VibrationEffect, שבה נוצרים הרטטים הפשוטים האלה באמצעות VibrationEffect.createOneshot או VibrationEffect.createWaveform.
Notification APIs
כשמתאימים אישית את ההתראות באפליקציה, אפשר להשתמש באחד מממשקי ה-API הבאים כדי לשייך תבנית לכל ערוץ התראות:
- AndroidX
- Android
לכל הצורות האלה יש דפוס בסיסי של גל סינוס עם הפסקות, כמו שמתואר למעלה, שבו הערך הראשון הוא העיכוב לפני הפעלת הרטט.
מושגים כלליים
יש כמה מושגים שרלוונטיים לכל ממשקי ה-API שמפורטים למעלה.
האם יש במכשיר מנגנון רטט?
אפשר לקבל מחלקה Vibrator שאינה null מ-context.getSystemService(Vibrator.class). אם למכשיר אין מנגנון רטט, לקריאות לממשקי ה-API של הרטט אין השפעה, ולכן האפליקציות לא צריכות להגביל את כל התכונות ההפטיות שלהן לתנאי מסוים. עם זאת, אם יש צורך בכך, אפליקציה יכולה לקרוא ל-hasVibrator() כדי לקבוע אם מדובר במנגנון רטט אמיתי (true) או ב-stub (false).
האם המשתמש השבית את התכונה 'תגובה משובצת למגע'?
יכול להיות שחלק מההטמעות המותאמות אישית ידרשו בדיקה ידנית כדי לוודא שהמשתמש השבית לחלוטין את ההגדרה תגובה למגע ב-Android. במקרה כזה, צריך להשבית את האפקטים של התגובה למגע. אפשר לשלוח שאילתה לגבי ההגדרה הזו באמצעות המפתח HAPTIC_FEEDBACK_ENABLED, כאשר ערך של אפס מציין שההגדרה מושבתת.
מאפייני רטט
אפשר לספק מאפייני רטט (כרגע בפורמט AudioAttributes) כדי לעזור למערכת להבין את מטרת הרטט. ההרשאה הזו נדרשת כשמפעילים רטט כשהאפליקציה פועלת ברקע, כי רק רטט שמושך את תשומת הלב נתמך לשימוש ברקע.
היצירה של AudioAttributes מוסברת במסמכי התיעוד של הכיתה, וצריך להתייחס אליה כאל רטט ולא כאל צליל.
כדוגמה, ברוב המקרים, סוג התוכן הוא CONTENT_TYPE_SONIFICATION,
והשימוש יכול להיות ערכים כמו USAGE_ASSISTANCE_SONIFICATION עבור
משוב מגע בחזית, או USAGE_ALARM עבור אזעקה ברקע. הסימון של אודיו לא משפיע על הרטט.
בקרת עוצמת הקול
אם יש רטט עם שליטה באמפליטודה, אפשר להפעיל רטטים בעוצמות שונות. זו יכולת חשובה ליצירת משוב הפטי עשיר, וגם מאפשרת למשתמשים לשלוט בעוצמות ברירת המחדל של המשוב ההפטי.
כדי לבדוק אם יש תמיכה בשליטה בעוצמת הקול, אפשר להתקשר אל Vibrator.hasAmplitudeControl. אם הרטט לא תומך באמפליטודה, כל ערכי האמפליטודה ימופו למצב מופעל/מושבת בהתאם לכך שהם אפס/לא אפס. לכן, אם במכשיר אין אמצעי בקרה לעוצמת התחושה, כדאי להשבית את האפליקציות שמשתמשות בתחושות מישוש עשירות בעוצמות שונות.
תמיכה באפקטים של מעטפות
מכשירים עם אפקטים של מעטפת תומכים ביצירת רטט דינמי ומדויק יותר, ומאפשרים שליטה מדויקת יותר בעוצמה ובחדות של הרטט, לחוויה מישושית עשירה יותר. כדי לבדוק אם המכשיר שלכם תומך בתכונה הזו, אפשר להשתמש בVibration.areEnvelopeEffectsSupported. אם לא, המערכת מתעלמת מרטט שמבוסס על מעטפה.