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

تستند جميع تحسينات إطار عمل 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)
  • CONFIRM
  • REJECT
  • 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)

الاهتزاز المتقطّع

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

تقنية اللمس الواضحة

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

يهدف نظام التشغيل 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) لمعرفة المزيد حول تنفيذ ميزة ردود الفعل اللمسية.

الضغط والإفلات

الشكل 2: الضغط على الزر ثم تركه

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

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

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

الشكل 3: اهتزازات غنية مع ملمس منزلق

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

الشكل 4. السحب والتمرير

حالة الاستخدام 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.

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

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

تطبيق تأثير التباطؤ

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

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

  3. اضبط سلسلة timings[] وamplitudes[] لإنشاء منحنى التباطؤ، كما هو موضّح في الشكل 5.

الاهتزاز الطويل

الشكل 5. منحنى التلاشي التدريجي للاهتزاز الطويل

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

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

مزايا التجاوب الحسّي المرتبط بالصوت

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

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

زوجان من أجهزة الصوت

الشكل 6. مثال على استخدام تقنية اللمس المزدوجة الصوتية

تقنية اللمس المرتبطة بالصوت: نصائح لتنفيذها

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

  • استخدِم الفئتَين 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) تلقائيًا.
    • تشمل حالات الاستخدام نغمات الرنين وأصوات واجهة المستخدم مع ردود فعل لمسية متزامنة.
  • يجب أن تنفّذ طبقة تجريد الأجهزة (HAL) الخاصة بجهاز الاهتزاز إمكانية التحكّم الخارجي.

تقنية اللمس المرتبطة بالصوت

الشكل 7. تنفيذ ميزة "اللمس المقترن بالصوت"

تقنية اللمس المرتبطة بالصوت: HapticGenerator

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

بنية Haptic Generator

الشكل 8. بنية Haptic Generator

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

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

  • التردد الرنيني لمرشّح تمرير النطاق

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

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

  • قوة التسوية لبطء التغليف

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

  • عامل الجودة لمرشّح إيقاف النطاق

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

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

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

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

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

  • تردد الزاوية للتشويه

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

  • مستوى الإدخال وعتبة التشويش

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

    • القيمة التلقائية لعامل زيادة مستوى الصوت هي 0.3.
    • القيمة التلقائية لحدّ المكعب هي 0.1.

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

    لمزيد من المعلومات حول الوظيفة التي تطبّقها هذه الفلتر، يُرجى الرجوع إلى التنفيذ في الرمز.

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

  • مستوى الصوت الناتج عن التشويش

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

    إذا كان الاهتزاز خفيفًا جدًا، يمكنك زيادة القيمة. إذا سمعت صوتًا مزعجًا من جهاز التشغيل، خفِّض القيمة.