يوضّح هذا المستند المحركات الخطية الرنانة (LRA) باعتبارها محركات اهتزاز شائعة في أجهزة Android، ويقدّم تفاصيل حول خصائصها وطريقة إنشائها لتجاوب حسّي وكيفية إنشاء أنماط لمسية فعّالة باستخدام واجهات برمجة التطبيقات في Android. keywords_public: > Android haptics, haptic actuators, Linear Resonant Actuators, LRAs, vibration, haptic feedback, VibratorFrequencyProfile, VibrationEffect, Android UI
إنّ أكثر مشغّلات الاهتزاز شيوعًا على أجهزة Android هي المشغّلات الرنانة الخطية (LRA). تحاكي المحركات الخطية الرنانة إحساس النقر على زر على سطح زجاجي غير مستجيب. تستغرق إشارة الملاحظات الواضحة والموجزة بشأن النقر عادةً ما بين 10 و20 ملي ثانية. ويجعل هذا الإحساس تفاعلات المستخدمين تبدو أكثر طبيعية. بالنسبة إلى لوحات المفاتيح الافتراضية، يمكن أن تساعد هذه الميزة في زيادة سرعة الكتابة والحدّ من الأخطاء.
تتضمّن المحركات الرنانة الخطية بعض الترددات الرنانة الشائعة:
- كانت بعض المحركات الخطية الرنانة تتضمّن ترددات رنانة في نطاق 200 إلى 300 هرتز، وهو النطاق الذي تكون فيه بشرة الإنسان أكثر حساسية للاهتزاز. عادةً ما يتم وصف الإحساس بالاهتزازات في هذا النطاق الترددي بأنّه سلس وحاد ونافذ.
- تتضمّن الطُرز الأخرى من المحركات الرنانة الخطية ترددات رنين أقل، تبلغ حوالي 150 هرتز، ويكون الإحساس الناتج عنها أكثر نعومة وامتلاءً (من حيث الأبعاد).
عند تطبيق جهد إدخال مماثل بترددَين مختلفَين، يمكن أن تختلف سعات اهتزاز الإخراج. وكلما كان التردد بعيدًا عن التردد الرنيني للمشغّل الخطي الرنان، انخفض سعة الاهتزاز.
تستخدم التأثيرات الحسية لجهاز معيّن كلاً من مشغّل الاهتزاز وبرنامجه. يمكن أن تقلّل مشغّلات اللمس التي تتضمّن ميزات التسارع الزائد والمكابح النشطة من وقت الارتفاع والرنين في المحركات الرنانة الخطية، ما يؤدي إلى اهتزاز أكثر استجابة ووضوحًا.
تسريع إخراج أداة الاهتزاز
تصف عملية ربط التردد بالتسارع الناتج (FOAM) الحد الأقصى للتسارع الناتج الذي يمكن تحقيقه (بوحدة G peak) عند تردد اهتزاز معيّن (بوحدة هرتز). بدءًا من Android 16 (المستوى 36 من واجهة برمجة التطبيقات)، يوفّر النظام الأساسي إمكانية استخدام هذه الميزة من خلال VibratorFrequencyProfile. يمكنك استخدام هذه الفئة مع واجهات برمجة التطبيقات الأساسية والمتقدّمة الخاصة بالحزمة لإنشاء تأثيرات لمسية.
تتضمّن معظم المحركات الرنانة ذات الحركة الخطية قمة واحدة في منحنى استجابتها الصوتية، وعادةً ما تكون بالقرب من التردد الرنان. بشكل عام، ينخفض التسارع بشكل كبير كلما انحرف التردد عن هذا النطاق. قد لا يكون المنحنى متماثلاً وقد يتضمّن جزءًا ثابتًا حول التردد الرنيني لحماية المحرك من التلف.
تعرض قطعة الأرض المجاورة مثالاً على FOAM لمحرك LRA.
حدّ رصد الإدراك البشري
يشير حدّ رصد الإدراك البشري إلى الحد الأدنى لتسارع الاهتزاز الذي يمكن للشخص رصده بشكل موثوق. يختلف هذا المستوى حسب تردد الاهتزاز.
تعرض الرسومات البيانية المجاورة الحد الأدنى لرصد الإدراك الحسي اللمسي لدى الإنسان، وذلك من حيث التسارع، كدالة للتردد الزمني. يتم تحويل بيانات الحد الأدنى من حد الإزاحة الموضّح في الشكل 1 من Bolanowski Jr. S. J.، وآخرون، 1988، "أربع قنوات تتوسط الجوانب الميكانيكية للمس".
يتعامل نظام التشغيل Android تلقائيًا مع هذا الحدّ في BasicEnvelopeBuilder،
الذي يتحقّق من أنّ جميع التأثيرات تستخدم نطاق تردد ينتج عنه
سعات اهتزاز تتجاوز الحدّ الأدنى لرصد الإدراك البشري بمقدار 10 ديسيبل على الأقل.
يشرح برنامج تعليمي على الإنترنت بشكل أكبر التحويل بين سعة التسارع وسعة الإزاحة.
مستويات تسارع الاهتزاز
إنّ إدراك الإنسان لشدة الاهتزاز، وهو مقياس إدراكي، لا يزداد بشكل خطي مع سعة الاهتزاز، وهي مَعلمة فيزيائية. تتميز الشدة المدرَكة بمستوى الإحساس (SL)، الذي يتم تعريفه على أنّه مقدار ديسيبل أعلى من حد الاكتشاف عند التردد نفسه.
يمكن احتساب سعة تسارع الاهتزاز المقابلة (بوحدة G peak) على النحو التالي:
...حيث إنّ مستوى الصوت بالديسيبل هو مجموع مستوى الصوت وحدّ الرصد، أي القيمة على المحور العمودي في الرسم البياني المجاور، عند تردد معيّن.
يعرض الرسم البياني المجاور مستويات تسارع الاهتزاز عند 10 و20 و30 و40 و50 ديسيبل SL، بالإضافة إلى عتبة رصد الإدراك الحسي اللمسي لدى الإنسان (0 ديسيبل SL)، كدالة للتردد الزمني. تم تقدير البيانات من الشكل 8 في Verrillo, R. T., et al.'s 1969 article, "Sensation magnitude of vibrotactile stimuli.".
يتولّى نظام التشغيل Android تلقائيًا عملية التحويل هذه في BasicEnvelopeBuilder،
الذي يأخذ القيم كشدّات معدَّلة في مساحة مستوى الإحساس (ديسيبل
SL) ويحوّلها إلى تسارع الناتج. من ناحية أخرى، لا تطبّق السمة WaveformEnvelopeBuilder هذه العملية، بل تستخدم قيمًا كقيم معدَّلة لسعات التسارع في مساحة التسارع (وحدات G). تفترض واجهة برمجة التطبيقات الخاصة بالمغلف أنّه عندما يفكّر مصمّم أو مطوّر في تغييرات في قوة الاهتزاز، يتوقّع أن تتبع الشدة المحسوسة مغلفًا خطيًا مجزأ.
تفعيل ميزة "تنعيم شكل الموجة" تلقائيًا على الأجهزة
للتوضيح، إليك طريقة عمل نمط شكل الموجة المخصّص على جهاز عام:
Kotlin
val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
تعرض المخططات التالية شكل الموجة المدخلة والتسارع الناتج المتوافق مع مقتطفات الرموز البرمجية السابقة. يُرجى العِلم أنّ التسارع يزداد تدريجيًا وليس فجأة، كلما حدث تغيير في السعة في النمط، أي عند 0 و150 و200 و250 و700 ملي ثانية. يحدث أيضًا تجاوز عند كل تغيير في مستوى الصوت، ويظهر تشويش مرئي يستمر لمدة 50 ملي ثانية على الأقل عندما ينخفض مستوى الصوت فجأة إلى 0.
نمط اهتزاز محسّن
لتجنُّب التجاوز وتقليل وقت الرنين، غيِّر السعات بشكل تدريجي أكثر. يوضّح ما يلي مخططات الموجة والتسارع للنسخة المعدّلة:
Kotlin
val timings: LongArray = longArrayOf(
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] {
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
};
int[] amplitudes = new int[] {
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
};
int repeatIndex = -1; // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
إنشاء تأثيرات لمسية أكثر تعقيدًا
تتسم العناصر الأخرى في الردّ على النقرة المُرضية بالتعقيد، ما يتطلّب بعض المعرفة بمشغّل الرنين الخطي (LRA) المستخدَم في الجهاز. للحصول على أفضل النتائج، استخدِم أشكال الموجات الجاهزة والثوابت التي توفّرها المنصة، والتي تتيح لك إجراء ما يلي:
- تنفيذ تأثيرات واضحة وعناصر أساسية
- يمكنك ربطها ببعضها لإنشاء تأثيرات لمسية جديدة.
يمكن لهذه الثوابت والأشكال الأولية المحدّدة مسبقًا أن تسرّع عملك بشكل كبير أثناء إنشاء تأثيرات لمسية عالية الجودة.