أساس تجربة المستخدم لإطار العمل باللمس

تستند جميع تحسينات إطار عمل Android المستندة إلى تقنية اللمس إلى مجموعة من مبادئ تجربة المستخدم التي تتطوّر بمعدّل متساوٍ. تشمل مبادئ التصميم الحالية استبدال الاهتزازات المزعجة بـ اللمسات الواضحة، ومحاولة استكشاف اللمسات الغنية.

مبادئ تجربة المستخدم

الشكل 1: المبادئ الحالية

يسرد الجدول التالي جميع واجهات برمجة التطبيقات المتاحة لللمس.

واجهة برمجة التطبيقات الطرق السنة التي تمت فيها الإضافة
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
قبل عام 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
‫2017 (Android 8)
  • تأكيد
  • إغلاق
  • GESTURE_START
  • GESTURE_END
‫2020 (Android 11)
android.View
  • performHapticFeedback()‎
قبل عام 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
قبل عام 2016
  • hasAmplitudeControl()‎
‫2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
‫2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
‫2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
‫2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()‎
  • compose()
‫2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
‫2019 (Android 10)

اهتزاز خفيف

منذ ظهور أجهزة إرسال الرسائل القصيرة والهواتف العادية، تم استخدام الاهتزازات المنخفضة الجودة والموفرة للطاقة والتي تعمل باستخدام آلة التنبيه كبديل للرنين الصوتي في الوضع الصامت. إنّ مكوّنات الأجهزة القديمة التي تُصدر ضوضاء عالية ومزعجة يمكن أن تضر بتجربة المستخدم من خلال اللمس من خلال تقديم مرات ظهور ذات جودة منخفضة (مثل هاتف رخيص ومتعطّل).

لمسات واضحة

توفّر اللمسات الواضحة إحساسًا بالتغييرات المنفصلة في الحالة (على سبيل المثال، التغييرات الثنائية أثناء عملية التشغيل/الإيقاف). بسبب طبيعة ميزة التفاعل المفصّلة، يتم إنشاء لمسات واضحة ككيان واحد (مثل تأثير لمسي واحد لكل حدث إدخال).

يهدف Android إلى توفير لمسات واضحة مع أحاسيس قوية ودقيقة بدلاً من الأحاسيس المزعجة أو غير الواضحة.

تشمل العوامل الثابتة المحدَّدة مسبقًا لللمس التي تم إنشاؤها لدعم اللمس الواضح ما يلي:

في HapticFeedbackConstants:

  • CLOCK_TICK
  • CONFIRM
  • CONTEXT_CLICK
  • GESTURE_END
  • GESTURE_START
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • KEYBOARD_TAP
  • LONG_PRESS
  • REJECT
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY
  • VIRTUAL_KEY_RELEASE

في VibrationEffect:

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

إنّ تبادل المعرفة بين المصنّعين والمطوّرين هو أمر أساسي لمحاولة تحسين الجودة العامة لللمس في منظومة Android المتكاملة. استخدِم قائمة التحقّق الأساسية وتقييم الأجهزة وCDD لمزيد من المعلومات حول تنفيذ تقنية اللمس.

الضغط ثم الرفع

الشكل 3: الضغط والإفلات

ميزات التجاوب الحسّي الغنية

اللمسات المميّزة هي فئة متنامية من اللمسات تتجاوز التأثيرات الفردية التي تستند إلى الدفعات. يهدف Android إلى توفير تجارب لمس ثرية مع إمكانية تركيبها وتعديلها بدقة عالية. يمكن استخدام حالات الاستخدام التالية في الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم.

تقنية اللمس الغنية

الشكل 4: تقنية لمس ثرية مع ملمس انسيابي

السحب والتمرير السريع

الشكل 5: السحب والتمرير

حالة الاستخدام 1: نسيج منزلق

إذا كان يتم تكرار تأثير لمسي أثناء تمرير الإصبع على سطح لمسي (مثل التمرير أو التمرير السريع أو استكشاف السطح باستخدام نسيج لمسي وهمي)، يُفضَّل أن تكون التأثيرات المتكررة للمس دقيقة وواضحة.

إذا كان التأثير الفردي صاخبًا بدلاً من أن يكون واضحًا، من المحتمل أن يتم محو الفواصل الزمنية بين تكراراته. والنتيجة هي صوت طنين واحد طويل بدلاً من إشارات متعددة منفصلة.

إذا لم تكن السعة صغيرة بما يكفي، ستزداد الطاقة التي يشعر بها المستخدم من خلال اللمس مع تكرار التأثير، ما يؤدي إلى شعوره بتأثير قوي للغاية في نهاية التكرار.

استخدام ملمس بسيط على السطح للإيماءات المتعلقة بالتمرير السريع والسحب

استخدِم CLOCK_TICK وTEXT_HANDLE_MOVE في HapticFeedbackConstants. وتحدِّد هذه الثوابت مسبقًا خصائص التكرار والسعة.

إنشاء تأثيرك الخاص

لإنشاء تأثير خاص بك، يمكنك إنشاء تصميم من خلال تسلسل PRIMITIVE_CLICK وPRIMITIVE_TICK في VibrationEffect.Composition. يمكنك ضبط خصائص التكرار ومقياس السعة باستخدام addPrimitive(int primitiveID, float scale, int delay). يعتمد الدعم على CAP_COMPOSE_EFFECTS إمكانيات Vibrator HAL Interface.

حالة الاستخدام 2: اهتزاز طويل مع تأثير تسهيل البدء

الاهتزاز الطويل هو اهتزاز سعة سلس ينتقل من 0 إلى السعة المستهدَفة. يمكن أن تؤدي الاهتزازات الطويلة إلى توليد إحساسات لمسية تجذب الانتباه بسهولة. ومع ذلك، يمكن أن يفاجئ الاهتزاز الطويل المفاجئ المستخدمين في بيئة هادئة، وغالبًا ما ينتج عنه ضوضاء صاخبة. لإنشاء اهتزاز طويل أكثر راحة، طبِّق تأثير تسهيل البداية في بداية الاهتزاز الطويل. يؤدي ذلك إلى انتقال سلس في السعة يتصاعد نحو السعة المستهدَفة.

تطبيق تأثير "التدرّج في السرعة"

  1. تحقَّق من إمكانات الجهاز للتحكّم في الشدة باستخدام android.os.Vibrator.hasAmplitudeControl().

    • يجب أن تكون النتيجة true لإنشاء تأثير تسهيل الدخول مع معدّل اتّساع متغيّر.
  2. استخدِم VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).

  3. عدِّل سلسلة timings[] وamplitudes[] لإنشاء منحنى التخفيف، كما هو موضّح في الشكل 6.

اهتزاز طويل

الشكل 6: منحنى تسهيل بدء الاهتزاز الطويل

حالة الاستخدام 3: اللمس المرتبط بالصوت

اللمس المرتبط بالصوت هو أنماط لمس مرتبطة بإيقاع الصوت لجذب انتباه المستخدم.

تقنية اللمس المزوّدة بصوت: المزايا

لتنفيذ تقنية اللمس المرتبط بالصوت، يمكنك الجمع بين اللمسات الواضحة والاهتزازات الطويلة. توفّر اللمسات القوية ولكن القصيرة من تقنية اللمس الواضح أنماطًا متقطعة للإيقاع. وعند دمجها مع المستويات العالية من المحفزات التي يوفّرها الاهتزاز الطويل، يؤدي ذلك إلى جذب انتباه المستخدم بشكل كبير.

من المهم مراعاة الأنماط الإيقاعية للشعور. في حال عدم شعور المستخدم بالإيقاع، سيتقبّل اللمسات على أنّها أزيز عشوائي، وسيميل إلى تجاهلها.

زوجان صوتيان

الشكل 7: مثال على إعدادات التجاوب الحسّي الصوتي

تقنية اللمس المزوّدة بصوت: نصائح حول التنفيذ

يتطلّب تنفيذ ميزة "اللمس المرتبط بالصوت" فهمًا أساسيًا لتشغيل المحتوى في كلّ من قنوات الصوت واللمس. يُرجى مراعاة ما يلي:

  • استخدِم صفوف MediaPlayer أو SoundPool.

    • تشير مواد العرض بتنسيق OGG التي تحتوي على مفتاح بيانات وصفية خاص (ANDROID_HAPTIC متبوعًا بعدد من قنوات اللمس) إلى توفّر بيانات اللمس وإمكانية التشغيل باستخدام MediaPlayer وSoundPool.
  • حدِّد إمكانية استخدام ميزة "اللمسات التفاعلية" وتشغيل الصوت في audio_policy_configuration.xml.

    • استخدِم ملف إخراج مع قناة اللمس AUDIO_CHANNEL_OUT_HAPTIC_A|B.
    • بالنسبة إلى بث الإخراج الذي يتضمّن قنوات لمسية، تذكَّر أنّه يتم عرض القنوات اللمسية كقنوات إضافية في البيانات.

    مثال

    إذا كان قناع القناة لبث الإخراج يبدو على النحو التالي:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    بعد ذلك، من المفترض أن تظهر كل عيّنة على النحو التالي:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • غيِّر AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) إلى false لتشغيل القناة التي توفّر ردود فعل لمسية.

    • تكون قنوات اللمس غير مفعّلة تلقائيًا (true).
    • وتشمل حالات الاستخدام نغمات الرنين وأصوات واجهة المستخدم مع ميزتَي اللمس والارتداد المتزامنتَين.
  • يجب أن ينفِّذ واجهة برمجة التطبيقات لجهاز الهزّر إمكانية التحكّم الخارجي.

ميزة "اللمس المرتبط بالصوت"

الشكل 8: تنفيذ تقنية لمس مزوّدة بصوت

التجاوب الحسّي المرتبط بالصوت: أداة إنشاء التأثيرات الصوتية

HapticGenerator هو تأثير صوتي تم طرحه في Android 12 ويمكنه إنشاء بيانات لمسية من قناة صوتية وتشغيلها في الوقت الفعلي كلمسة مرتبطة بالصوت. يتم تطبيق التأثير على AudioTrack كما هو موضّح في الشكل 9.

بنية أداة إنشاء اللمس

الشكل 9: بنية أداة إنشاء اللمس

للتأكّد من أنّ خوارزمية إنشاء اللمس تُنشئ لمسات عالية الجودة، عليك ضبط خوارزمية الإنشاء على محرّك الهزاز في الجهاز من خلال تعديل المَعلمات التي تحدّد سلسلة الفلاتر التي تُطبّقها على أشكال الموجات الصوتية. يوضّح هذا القسم هذه المَعلمات بالتفصيل، ويشرح كيفية ضبطها وفقًا لمواصفات الجهاز.

  1. التردد الرنان لفلتر تمرير النطاق

    تردد الرنين للاهتزاز هو التردد الذي يحقّق فيه المحرّك اللمسي أقصى طاقة ناتجة. تعمل هذه المَعلمة على ضبط مُعاكس للمرنان بهدف تسطيح دالة نقل الاستجابة جزئيًا، وذلك للحصول على نطاق تردد أوسع. يربط إطار عمل Android هذه القيمة تلقائيًا بمخرجات IVibrator.getResonantFrequency، وهي طريقة HAL الخاصة بالاهتزاز.

    القيمة التلقائية لهذه المَعلمة هي 150 هرتز. يمكن تعديل ذلك في الرمز البرمجي هنا.

  2. تأثير التطبيع في المنحنى البطيء

    تحدِّد هذه المَعلمة الأس في التسويف الجزئي (التحكّم التلقائي في الكسب). وتكون القيمة التلقائية لها هي -0.8، ما يعني أنّه تتم إزالة ‎80% من التباين في النطاق الديناميكي من خلال خطوة التحكّم في الكسب هذه. يمكن تعديل ذلك في الرمز هنا.

  3. معامل Q لفلترة التوقف عن النطاق

    يتم تحديد عامل جودة الهزّاز (عامل Q) من خلال مَعلمتَين:

    • معامل Q الصفري، وهو عامل الجودة للأصفار في فلتر التوقف النطاقي الذي يلغي الرنين جزئيًا.

    • Q للقطب، وهو عامل جودة الأقطاب في فلتر التوقف النطاقي

    تحدّ نسبة هاتين القيمتَين من قمع الرنين من أجل تعزيز الترددات المنخفضة وتوسيع نطاق استجابة الخوارزمية. على سبيل المثال، تؤدي القيم التلقائية 8 لمعامل Q الصفري و4 لمعامل Q للقطب إلى توليد نسبة 2، ما يحدّ من قمع الرنين بمقدار 2 (6 ديسيبل). يربط إطار عمل Android كلا القيمتَين بمخرج IVibrator.getQFactormethod في واجهة HAL الخاصة بالاهتزاز.

    إذا كانت القيم التلقائية لا تراعي ضعف قوة المحرّك في جهازك، ننصحك بتعديل القيمتَين في الوقت نفسه، وإما زيادة كليهما أو خفض كليهما. يجب أن تكون نسبة Q الصفري إلى Q للقطب أكبر من 1. يمكن تعديل ذلك في الرمز هنا.

  4. التردد الحدّي للتشويش

    يتم تطبيق تردد الزاوية من خلال فلتر تمرير منخفض يعمل على تقليل الاهتزازات ذات المستوى المنخفض وتحسين المستويات الأعلى باستخدام تشويه ثلاثي الأبعاد. الإعداد التلقائي هو 300 هرتز. يمكن تعديل ذلك في الرمز هنا.

  5. معدّل اكتساب الإدخال وعتبة المكعب للتشويش

    يتم استخدام هذه المَعلمات من خلال فلتر تشويه غير خطي يُطبَّق على موجة الجهد الكهربائية المُدخلة التي تُخفِّض من شدة إشارات الترددات المنخفضة وتفتِّح إشارات الترددات العالية.

    • القيمة التلقائية لمعامل كسب الإدخال هي 0.3.
    • القيمة التلقائية لمستوى استيفاء الشروط في المكعب هي 0.1.

    ننصحك بتعديل كلتا القيمتَين معًا. يمكنك العثور عليها في الرمز المبرمَج هنا.

    لمزيد من المعلومات عن الدالة التي يطبّقها هذا الفلتر، يُرجى الرجوع إلى مستند تنفيذ الإجراء المتاح هنا. لمعرفة المزيد من المعلومات عن كيفية تأثير هاتين المَعلمتَين في الإخراج، ننصحك بتخطيط استجابات الترددات للفلاتر وملاحظة كيفية تغيُّر استجابات الترددات مع قيم المَعلمات المختلفة.

  6. مُضاعِف الإخراج للتشويش

    تتحكّم هذه المَعلمة في سعة الاهتزاز النهائية. وهو عبارة عن مكاسب نهائية تُطبَّق بعد محدد نطاق خفيف يحدّ من سعة الاهتزاز إلى أقل من 1. القيمة التلقائية هي 1.5، ويمكن تعديلها في الرمز المبرمَج هنا. إذا كان الاهتزاز خفيفًا جدًا، عليك زيادة القيمة. إذا كنت تسمع هديرًا في معدّات المحرّك، عليك خفض القيمة.