تستند جميع تحسينات إطار عمل Android التي تم إنشاؤها حول اللمسات إلى مجموعة من مبادئ تجربة المستخدم التي تتطوّر بالمعدل نفسه. تتضمّن المبادئ الحالية استبدال الاهتزازات المزعجة باللمس الواضح واستكشاف اللمس الغني.
الشكل 1. المبادئ الحالية
يسرد الجدول التالي جميع واجهات برمجة التطبيقات المتاحة للتحكّم باللمس:
واجهة برمجة التطبيقات | الطُرق والثوابت | سنة الإضافة |
---|---|---|
android.view.HapticFeedbackConstants |
|
قبل عام 2016 |
|
2017 (Android 8) | |
|
2020 (الإصدار 11 من نظام التشغيل Android) | |
android.View |
|
قبل عام 2016 |
android.os.Vibrator |
|
قبل عام 2016 |
|
2017 (Android 8) | |
|
2020 (الإصدار 11 من نظام التشغيل Android) | |
android.os.VibrationEffect |
|
2017 (Android 8) |
|
2019 (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 (الإصدار 11 من نظام التشغيل Android) |
android.media.AudioAttributes.Builder |
|
2019 (Android 10) |
الاهتزاز المتقطّع
منذ ظهور أجهزة النداء والهواتف العادية، تم استخدام الاهتزازات القائمة على الجرس ذات الجودة المنخفضة ولكنها موفّرة للطاقة، والتي تعتمد على كتلة دوارة غير متوازنة (ERM)، كبديل للرنين المسموع في الوضع الصامت. يمكن أن تؤدي مكوّنات الأجهزة القديمة التي تصدر ضوضاء عالية وغير سارة إلى الإضرار بتجربة المستخدم الحسية من خلال تقديم انطباعات منخفضة الجودة (على سبيل المثال، هاتف رخيص ومعطّل).
محو تقنية اللمس
تتيح الاهتزازات الواضحة الشعور بالتغييرات المنفصلة في الحالة (على سبيل المثال، التغييرات الثنائية أثناء عملية التشغيل والإيقاف). بسبب طبيعة الإتاحة المنفصلة، يتم إنشاء ردود فعل لمسية واضحة ككيان واحد (على سبيل المثال، تأثير لمسي واحد لكل حدث إدخال).
يهدف نظام التشغيل Android إلى تقديم ردود فعل لمسية واضحة مع إحساس قوي وحاد، بدلاً من الإحساس بالاهتزاز أو عدم الوضوح.
تتضمّن الثوابت اللمسية المحدّدة مسبقًا التي تم إنشاؤها لتوفير تجربة لمسية واضحة العناصر التالية.
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 إلى السعة المستهدفة. يمكن أن يؤدي الاهتزاز الطويل إلى إنشاء إشارات لمسية ملحوظة لجذب الانتباه. ومع ذلك، يمكن أن يؤدي الاهتزاز الطويل المفاجئ إلى إزعاج المستخدمين في بيئة هادئة، وغالبًا ما يصدر عنه ضوضاء طنين مسموعة. لإنشاء اهتزاز طويل أكثر متعة، طبِّق تأثير التلاشي التدريجي في بداية الاهتزاز الطويل. يؤدي ذلك إلى انتقال سلس في السعة يزداد تدريجيًا إلى أن يصل إلى السعة المستهدَفة.
تطبيق تأثير التباطؤ
تحقَّق من إمكانات الأجهزة للتحكّم في مستوى الصوت باستخدام
android.os.Vibrator.hasAmplitudeControl()
.- يجب أن تكون النتيجة
true
لإنشاء تأثير التلاشي التدريجي مع سعة متغيرة.
- يجب أن تكون النتيجة
استخدِم
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.اضبط سلسلة
timings[]
وamplitudes[]
لإنشاء منحنى التباطؤ، كما هو موضّح في الشكل 5.
الشكل 5. منحنى التلاشي التدريجي للاهتزاز الطويل
حالة الاستخدام 3: اللمس المقترن بالصوت
اللمسات المرتبطة بالصوت هي أنماط لمسية مرتبطة بإيقاع الصوت لجذب انتباه المستخدم.
التجاوب الحسّي المرتبط بالصوت: المزايا
لتنفيذ ردود فعل لمسية مرتبطة بالصوت، يجب الجمع بين ردود الفعل اللمسية الواضحة والاهتزازات الطويلة. توفّر ردود الفعل اللمسية القوية ولكن القصيرة من Clear Haptics أنماطًا إيقاعية منفصلة. وعندما يتم الجمع بينها وبين مستويات التحفيز العالية التي توفّرها الاهتزازات الطويلة، فإنّ ذلك يؤدي إلى جذب انتباه المستخدم بشكل فعّال.
من المهم مراعاة الأنماط الإيقاعية للإحساس. إذا لم يكن هناك إحساس بالإيقاع، سيتلقّى المستخدم الأحاسيس اللمسية على أنّها اهتزازات عشوائية، وسيتجاهلها على الأرجح.
الشكل 6. مثال على ردود الفعل اللمسية المرتبطة بالصوت
تقنية اللمس المرتبطة بالصوت: نصائح لتنفيذها
يتطلّب تنفيذ ميزة "اللمس المرتبط بالصوت" فهمًا أساسيًا لتشغيل المحتوى في كل من قنوات الصوت واللمس. يُرجى مراعاة ما يلي:
استخدِم الفئتين
MediaPlayer
أوSoundPool
.- تشير مواد العرض بتنسيق OGG التي تتضمّن مفتاح بيانات وصفية خاصًا (
ANDROID_HAPTIC
متبوعًا بعدد من قنوات اللمس) إلى توفّر بيانات اللمس وإمكانية تشغيلها باستخدامMediaPlayer
وSoundPool
.
- تشير مواد العرض بتنسيق OGG التي تتضمّن مفتاح بيانات وصفية خاصًا (
تحديد ما إذا كان التطبيق يتيح استخدام تقنية اللمس وتشغيل الصوت في
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) الخاصة بجهاز الاهتزاز إمكانية التحكّم الخارجي.
- بالنسبة إلى عمليات تنفيذ HIDL، استخدِم
setExternalControl(bool enabled) generates (Status status)
. - بالنسبة إلى عمليات تنفيذ AIDL، استخدِم
void setExternalControl(in boolean enabled)
.
- بالنسبة إلى عمليات تنفيذ HIDL، استخدِم
الشكل 7. تنفيذ ميزة "اللمس المرتبط بالصوت"
التجاوب الحسّي المرتبط بالصوت: HapticGenerator
HapticGenerator
هو تأثير صوتي تم تقديمه في Android 12
يمكنه إنشاء بيانات حسية من قناة صوتية وتشغيلها في الوقت الفعلي
كتأثيرات حسية مرتبطة بالصوت. يتم تطبيق التأثير على AudioTrack
كما هو موضح في الشكل 8:
الشكل 8. بنية Haptic Generator
تعرض هذه الصورة المرئية لبنية النظام الموضع الذي يتم فيه تطبيق "مولّد الاهتزاز" على دفق الصوت الوارد من المستخدم قبل إرساله إلى طبقة تجريد الأجهزة الصوتية (HAL). يتم تطبيق أداة الإنشاء بعد أن يقسّم AudioMixer
البيانات الصوتية وبيانات اللمس وقبل أي تأثير صوتي آخر، ويحلّ الناتج محل أي بيانات لمس سابقة في البث.
للتأكّد من أنّ خوارزمية إنشاء ردود الفعل اللمسية تنشئ ردود فعل لمسية عالية الجودة، اضبط خوارزمية الإنشاء على محرك الاهتزاز في الجهاز من خلال تعديل المَعلمات التي تضبط سلسلة الفلاتر التي تطبّقها على أشكال الموجات الصوتية. يوضّح هذا القسم هذه المَعلمات بالتفصيل، ويشرح كيفية ضبطها بما يتناسب مع مواصفات جهازك.
التردد الرنيني لمرشّح تمرير النطاق
تردد الرنين في جهاز الاهتزاز هو التردد الذي يقدّم فيه المحرّك اللمسي أعلى مستوى من الأداء. تعدّل هذه المَعلمة مضاد الرنين لتسطيح دالة نقل الاستجابة جزئيًا، وذلك للحصول على نطاق ترددي أوسع. يربط إطار عمل Android هذه القيمة تلقائيًا بنتيجة طريقة Vibrator HAL
IVibrator.getResonantFrequency
.القيمة التلقائية لهذه المَعلمة هي 150 هرتز، ويمكنك تعديلها في الرمز.
قوة التسوية لبطء التغيّر في مستوى الصوت
تحدّد هذه المَعلمة الأس في التسوية الجزئية (التحكّم التلقائي في مستوى الصوت). القيمة التلقائية هي -0.8، ما يعني أنّه تتم إزالة% 80 من التغيّر في النطاق الديناميكي من خلال خطوة التحكّم في مستوى الصوت هذه. يمكنك تعديل ذلك في الرمز.
عامل الجودة لمرشّح إيقاف النطاق
يتم تحديد عامل جودة الاهتزاز (عامل Q) من خلال مَعلمتَين:
The Zero Q, the quality factor of the zeros in the band-stop filter that partially cancels the resonance
Pole Q، وهو عامل جودة الأقطاب في فلتر إيقاف النطاق
تحدّ نسبة هاتين القيمتين من كبح الرنين لتعزيز الترددات المنخفضة وتوسيع استجابة الخوارزمية. على سبيل المثال، تؤدي القيم التلقائية 8 لـ Zero Q و4 لـ Pole Q إلى نسبة 2، ما يحدّ من كبح الرنين بمعامل 2 (6 ديسيبل). يربط إطار عمل Android كلتا القيمتين بنتيجة طريقة
IVibrator.getQFactor
في Vibrator HAL.إذا لم تأخذ القيم التلقائية في الاعتبار التخميد في قوة المحرك في جهازك، ننصحك بتعديل كلتا القيمتين في الوقت نفسه، إما بزيادتهما أو إنقاصهما. يجب أن تكون نسبة Zero Q إلى Pole Q أكبر من 1. يمكنك تعديل ذلك في الرمز.
تردد الزاوية للتشويه
يتم تطبيق تردد القطع بواسطة فلتر تمرير منخفض يعمل على كبح الاهتزازات المنخفضة المستوى وتعزيز المستويات الأعلى باستخدام تشويه مكعّب. القيمة التلقائية هي 300 هرتز، ويمكنك تعديلها في الرمز.
مستوى الصوت المُدخل وحدّ التشويه
يستخدم فلتر التشويش غير الخطي هذه المَعلمات التي يتم تطبيقها على شكل الموجة الداخلة، ما يؤدي إلى تخفيف سعة الإشارات ذات التردد المنخفض وزيادة سعة الإشارات ذات التردد المرتفع.
- القيمة التلقائية لعامل كسب الإدخال هي 0.3.
- القيمة التلقائية لحدّ المكعب هي 0.1.
ننصحك بتعديل كلتا القيمتَين معًا. ويمكن العثور عليها في الرمز.
لمزيد من المعلومات حول الوظيفة التي تطبّقها هذه الفلتر، يُرجى الرجوع إلى التنفيذ في الرمز.
لمعرفة المزيد حول كيفية تأثير هاتين المَعلمتَين في الناتج، ننصحك برسم استجابات التردد للفلاتر ومراقبة كيفية تغيُّر استجابات التردد مع قيم المَعلمات المختلفة.
مستوى الصوت الناتج للتشويه
تتحكّم هذه المَعلمة في سعة الاهتزاز النهائية. وهي عبارة عن مستوى صوت نهائي يتم تطبيقه بعد أداة تحديد مستوى الصوت المنخفض التي تحدّ من سعة الاهتزاز إلى أقل من 1. القيمة التلقائية هي 1.5، ويمكنك تعديلها في الرمز.
إذا كان الاهتزاز خفيفًا جدًا، يمكنك زيادة القيمة. إذا سمعت صوتًا مزعجًا من جهاز التشغيل، قلِّل القيمة.