جهاز تجهيز محركات الاهتزاز

قبل تصميم التأثيرات الملموسة على جهاز Android، ننصحك بالاطّلاع على نظرة عامة حول آلية عمل مشغّلات الاهتزاز.

رسم توضيحي لمكوّنات LRA الملموسة

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

بناءً على الجهد الكهربائي نفسه للإدخال على ترددين مختلفين، يمكن أن تختلف سعات إخراج الاهتزاز. كلّما ابتعد التردّد عن الترددات الرنانة لـ LRA، انخفضت سعات الاهتزاز.

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

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

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 // Do not 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 // Do not 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 // Do not 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; // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

مخطط الشكل الموجي المدخل مع خطوات إضافية

مخطط الشكل الموجي الذي تم قياسه يُظهر انتقالات أكثر سلاسة

وبالتالي، يتطلّب إنشاء تأثير ملموس على جهاز Android أكثر من مجرد توفير قيمة تردد وسعة. إن تصميم تأثير ملموس من الصفر من نقطة الصفر ليس مهمة بسيطة بدون الوصول الكامل إلى المواصفات الهندسية لمشغّل الاهتزاز والسائق. توفّر واجهات برمجة تطبيقات Android ثوابت تتيح لك إجراء ما يلي:

  • استخدِم تأثيرات وعناصر أساسية واضحة.

  • قم بتسلسلها لإنشاء تأثيرات لمسية جديدة.

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