الاهتزاز على أندرويد: كيفية التحكم في التردد والسعة (Kotlin)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا التحكم في الاهتزاز على أندرويد؟ من "دزين" إلى تحفة لمسية

\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

اليوم، لدينا ثلاثة أساليب رئيسية:

\n
    \n
  • Vibrator + VibrationEffect (API 26+) - أساسي ولكنه مرن.
  • \n
  • VibratorManager (API 31+) - حديث، للأجهزة متعددة الاهتزازات.
  • \n
  • Vibrator.vibrate() القديم - للتوافق مع الإصدارات السابقة فقط.
  • \n
\n\n

سنركز على الأولين، حيث أنهما يمنحان التحكم في التردد والسعة.

\n\n

التحضير: إذن الاهتزاز

\n\n

قبل أن تبدأ "زلزالًا"، لا تنس إضافة الإذن في ملف AndroidManifest.xml:

\n
<uses-permission android:name="android.permission.VIBRATE" />
\n\n

بدونه، سيتم تجاهل الكود الخاص بك - لن تظهر أي أخطاء، ولكن لن يكون هناك اهتزاز أيضًا.

\n\n

الطريقة 1: VibrationEffect - التحكم في التردد والسعة (API 26+)

\n\n

تسمح الفئة VibrationEffect بإنشاء اهتزاز بتردد محدد (من خلال السعة) ومدة. لا يتم ضبط التردد في أندرويد مباشرة بالهرتز - بدلاً من ذلك، يتم استخدام السعة (0-255)، والتي يتم تحويلها بواسطة الجهاز إلى تردد. كلما زادت السعة، زادت شدة الاهتزاز.

\n\n

اهتزاز بسيط مع سعة

\n\n
val 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:

\n
val weakVibration = VibrationEffect.createOneShot(300, 50)\nvibrator.vibrate(weakVibration)
\n\n

السعة 255 هي الحد الأقصى، و1 بالكاد ملحوظة. جرب!

\n\n

الأنماط: اهتزاز مع فترات توقف

\n\n

أحيانًا لا تحتاج فقط إلى "دزين"، بل إلى نبض. استخدم createWaveform:

\n
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 بدلاً من مصفوفة السعات، فسيتم استخدام السعة القصوى في جميع المراحل.

\n\n

الطريقة 2: VibratorManager - للأجهزة الحديثة (API 31+)

\n\n

بدءًا من أندرويد 12، يُوصى باستخدام VibratorManage

المدونات

توصيات الكتب