لماذا التحكم في الاهتزاز على أندرويد؟ من "دزين" إلى تحفة لمسية
\n\nهل تساءلت يومًا لماذا تهتز بعض التطبيقات بشكل لطيف ودقيق، بينما يهتز البعض الآخر مثل مثقاب الجار خلف الجدار؟ الأمر كله يتعلق بـ تردد وسعة الاهتزاز. على موقع Stack Overflow، حصد سؤال "How to make an Android device vibrate with different frequency?" آلاف المشاهدات - وهذا ليس من قبيل الصدفة. لا يريد المطورون فقط "تشغيل الاهتزاز"، بل إنشاء ردود فعل لمسية ذات معنى: لمسة خفيفة، إشارة إنذار نابضة، أو محاكاة ضغطة زر ميكانيكي.
\n\nفي هذه المقالة، سنشرح كيفية التحكم في الاهتزاز على أندرويد باستخدام Kotlin. ستتعرف على واجهات API الموجودة، وكيف تطورت من أندرويد 8 إلى أندرويد 14، وأي نهج تختاره لمشروعك. هيا بنا!
\n\nنبذة تاريخية سريعة: من Vibrator إلى VibratorManager
\n\nلفترة طويلة، استخدم مطورو أندرويد الفئة Vibrator والطريقة vibrate(long milliseconds). بسيطة ولكنها محزنة: لا يوجد تحكم في التردد. مع ظهور أندرويد 8 (API 26)، قدمت Google VibrationEffect - أداة قوية لإنشاء أنماط اهتزاز معقدة. وفي أندرويد 12 (API 31)، تمت إضافة VibratorManager، والذي يسمح بالتحكم في عدة أجهزة اهتزاز (على سبيل المثال، في الأجهزة القابلة للطي).
اليوم، لدينا ثلاثة أساليب رئيسية:
\n- \n
- Vibrator + VibrationEffect (API 26+) - أساسي ولكنه مرن. \n
- VibratorManager (API 31+) - حديث، للأجهزة متعددة الاهتزازات. \n
- Vibrator.vibrate() القديم - للتوافق مع الإصدارات السابقة فقط. \n
سنركز على الأولين، حيث أنهما يمنحان التحكم في التردد والسعة.
\n\nالتحضير: إذن الاهتزاز
\n\nقبل أن تبدأ "زلزالًا"، لا تنس إضافة الإذن في ملف AndroidManifest.xml:
<uses-permission android:name="android.permission.VIBRATE" />\n\nبدونه، سيتم تجاهل الكود الخاص بك - لن تظهر أي أخطاء، ولكن لن يكون هناك اهتزاز أيضًا.
\n\nالطريقة 1: VibrationEffect - التحكم في التردد والسعة (API 26+)
\n\nتسمح الفئة VibrationEffect بإنشاء اهتزاز بتردد محدد (من خلال السعة) ومدة. لا يتم ضبط التردد في أندرويد مباشرة بالهرتز - بدلاً من ذلك، يتم استخدام السعة (0-255)، والتي يتم تحويلها بواسطة الجهاز إلى تردد. كلما زادت السعة، زادت شدة الاهتزاز.
اهتزاز بسيط مع سعة
\n\nval vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator\n\n// اهتزاز لمدة 500 مللي ثانية بأقصى سعة (255)\nval effect = VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE)\nvibrator.vibrate(effect)\n\nاهتزاز بتردد (سعة) مختلف
\n\nهل تريد اهتزازًا ضعيفًا؟ حدد سعة 50:
\nval weakVibration = VibrationEffect.createOneShot(300, 50)\nvibrator.vibrate(weakVibration)\n\nالسعة 255 هي الحد الأقصى، و1 بالكاد ملحوظة. جرب!
\n\nالأنماط: اهتزاز مع فترات توقف
\n\nأحيانًا لا تحتاج فقط إلى "دزين"، بل إلى نبض. استخدم createWaveform:
val timings = longArrayOf(0, 200, 100, 300) // توقف، اهتزاز، توقف، اهتزاز\nval amplitudes = intArrayOf(0, 200, 0, 150) // السعة لكل مرحلة\n\nval pattern = VibrationEffect.createWaveform(timings, amplitudes, -1) // -1 = عدم التكرار\nvibrator.vibrate(pattern)\n\nالعنصر الأول في timings هو التأخير الأولي. عادةً ما يتم ضبطه على 0. يجب أن يكون amplitudes بنفس الطول. إذا قمت بتمرير null بدلاً من مصفوفة السعات، فسيتم استخدام السعة القصوى في جميع المراحل.
الطريقة 2: VibratorManager - للأجهزة الحديثة (API 31+)
\n\nبدءًا من أندرويد 12، يُوصى باستخدام VibratorManage