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

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

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

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

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

API طُرق تمت إضافة العام
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • ضغطة طويلة
قبل عام 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (اندرويد 8)
  • تؤكد
  • رفض
  • GESTURE_START
  • GESTURE_END
2020 (أندرويد 11)
android.View
  • أداء سريع
قبل عام 2016
android.os. الهزاز
  • تذبذب()
  • هزاز ()
قبل عام 2016
  • hasAmplitudeControl ()
2017 (اندرويد 8)
  • areAllEffectsSupported ()
  • areAllPrimitivesSupported ()
  • areEffectsSupported ()
  • arePrimitivesSupported ()
2020 (أندرويد 11)
android.os.VibrationEffect
  • createOneShot ()
  • createWaveform ()
2017 (اندرويد 8)
  • EFFECT_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
  • setHapticChannels مكتومة ()
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)

    to 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 لـ Zero Q و 4 للقطب Q تنتج نسبة 2 ، مما يحد من قمع الرنين بمعامل 2 (6 ديسيبل). يربط إطار عمل Android كلا القيمتين بإخراج طريقة Vibrator HAL IVibrator.getQFactor .

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

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

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

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

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

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

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

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

  6. كسب الإخراج للتشويه

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