أساس UX للإطار اللمسي

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

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

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

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

واجهة برمجة التطبيقات طُرق تمت إضافة السنة
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • لوحة المفاتيح_TAP
  • ضغطة طويلة
قبل عام 2016
  • KEYBOARD_PRESS
  • إصدار لوحة المفاتيح
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (أندرويد 8)
  • يتأكد
  • يرفض
  • GESTURE_START
  • GESTURE_END
2020 (أندرويد 11)
android.View
  • أداء HapticFeedback()
قبل عام 2016
android.os.Vibrator
  • تذبذب()
  • يحتوي على هزاز ()
قبل عام 2016
  • hasAmplitudeControl()
2017 (أندرويد 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (أندرويد 11)
android.os.VibrationEffect
  • كريت ون شوت ()
  • إنشاءWaveform()
2017 (أندرويد 8)
  • تأثير_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • إنشاء محدد مسبقًا ()
2019 (أندرويد 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • مؤلف موسيقى()
2020 (أندرويد 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (أندرويد 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) . لمعرفة المزيد حول التنفيذ اللمسي.

اضغط وحرر

الشكل 3. الضغط والإفراج.

لمسات غنية

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

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

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

حالة الاستخدام 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 ).
    • تتضمن حالات الاستخدام نغمات الرنين وأصوات واجهة المستخدم مع اللمسات والملاحظات المتزامنة.
  • يجب أن يقوم Vibrator HAL بتنفيذ دعم التحكم الخارجي.

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

الشكل 8. تنفيذ اللمسات الصوتية المقترنة

اللمسات الصوتية المقترنة: مولد اللمس

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

Haptic Generator architecture

الشكل 9. بنية المولد اللمسي

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

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

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

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

  2. قوة التطبيع للمغلف البطيء

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

  3. عامل Q لمرشح إيقاف النطاق

    يتم تحديد عامل جودة الهزاز (عامل Q) بواسطة معلمتين:

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

    • القطب Q، عامل جودة الأعمدة في مرشح إيقاف النطاق.

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

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

  4. تردد الزاوية للتشويه

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

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

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

    • القيمة الافتراضية لعامل كسب الإدخال هي 0.3 .
    • القيمة الافتراضية لعتبة المكعب هي 0.1 .

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

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

  6. كسب الناتج للتشويه

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