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

تستند جميع تحسينات إطار عمل 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 واجهة HAL الخاصة بالهزّاز.

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

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

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

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

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

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

اهتزاز طويل

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

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

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

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

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

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

زوجان صوتيان

الشكل 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:

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

الشكل 8: بنية أداة الاستجابة باللمس

يوضّح مخطّط الرؤية هذا للبنية المكان الذي يتم فيه تطبيق "مُنشئ اللمس" على بث الصوت الوافد من المستخدم قبل إرساله إلى Audio HAL. يتم تطبيق أسلوب الإنشاء بعد أن يقسم AudioMixer البيانات الصوتية واللمسية وقبل أي أثر صوتي آخر، وتتجاهل النتيجة أي بيانات لمسية سابقة في البث.

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

  • التردد الرنان لفلتر تمرير النطاق

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

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

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

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

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

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

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

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

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

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

  • التردد الحدّي للتشويش

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

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

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

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

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

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

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

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

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

    إذا كان الاهتزاز خفيفًا جدًا، عليك زيادة القيمة. إذا كنت تسمع هديرًا في معدّات المحرّك، عليك خفض القيمة.