Aktuator getaran yang paling umum di perangkat Android adalah aktuator resonan linear (LRA). LRA menyimulasikan perasaan klik tombol pada permukaan kaca yang tidak responsif. Sinyal masukan klik yang jelas dan tajam biasanya berlangsung antara 10 dan 20 milidetik. Sensasi ini membuat interaksi pengguna terasa lebih alami. Untuk keyboard virtual, masukan klik ini dapat meningkatkan kecepatan mengetik dan mengurangi error.
LRA memiliki beberapa frekuensi resonansi umum:
- Beberapa LRA memiliki frekuensi resonansi dalam rentang 200 hingga 300 Hz, yang bersamaan dengan frekuensi saat kulit manusia paling sensitif terhadap getaran. Sensasi getaran pada rentang frekuensi ini biasanya digambarkan sebagai halus, tajam, dan menembus.
- Model LRA lainnya memiliki frekuensi resonansi yang lebih rendah, sekitar 150 Hz. Sensasi secara kualitatif lebih lembut dan lebih penuh (dalam dimensi).
Dengan tegangan input yang sama pada dua frekuensi yang berbeda, amplitudo output getaran dapat berbeda. Makin jauh frekuensi dari frekuensi resonansi LRA, makin rendah amplitudo getarnya.
Efek haptic perangkat tertentu menggunakan aktuator getaran dan driver-nya. Driver haptic yang menyertakan fitur overdrive dan pengereman aktif dapat mengurangi waktu naik dan dering LRA, sehingga menghasilkan getaran yang lebih responsif dan jelas.
Akselerasi output vibrator
Pemetaan frekuensi ke akselerasi output (FOAM) menjelaskan akselerasi output maksimum
yang dapat dicapai (dalam puncak G) pada frekuensi getaran tertentu (dalam
Hertz). Mulai Android 16 (API level 36), platform ini menyediakan dukungan bawaan
untuk pemetaan ini melalui VibratorFrequencyProfile
. Anda dapat menggunakan
class ini, bersama dengan API amplop dasar dan lanjutan, untuk membuat
efek haptik.
Sebagian besar motor LRA memiliki satu puncak dalam FOAM, biasanya di dekat frekuensi resonansinya. Akselerasi umumnya menurun secara eksponensial saat frekuensi menyimpang dari rentang ini. Kurva mungkin tidak simetris dan mungkin memiliki dataran tinggi di sekitar frekuensi resonansi untuk melindungi motor dari kerusakan.
Plot yang berdekatan menunjukkan contoh FOAM untuk motor LRA.
Batas deteksi persepsi manusia
Batas deteksi persepsi manusia mengacu pada akselerasi minimum getaran yang dapat dideteksi dengan andal oleh seseorang. Tingkat ini bervariasi berdasarkan frekuensi getaran.
Plot yang berdekatan menunjukkan nilai minimum deteksi persepsi haptic manusia, dalam akselerasi, sebagai fungsi frekuensi temporal. Data nilai minimum dikonversi dari nilai minimum perpindahan pada Gambar 1 Bolanowski Jr., S. J., et al. tahun 1988, "Empat saluran memediasi aspek mekanis sentuhan"..
Android secara otomatis menangani nilai minimum ini di BasicEnvelopeBuilder
,
yang memverifikasi bahwa semua efek menggunakan rentang frekuensi yang menghasilkan amplitudo
getaran yang melebihi nilai minimum deteksi persepsi manusia sebesar setidaknya
10 dB.
Tutorial online menjelaskan lebih lanjut konversi antara amplitudo akselerasi dan amplitudo perpindahan.
Tingkat akselerasi getaran
Persepsi manusia tentang intensitas getaran, yaitu pengukuran persepsi, tidak tumbuh secara linear dengan amplitudo getaran, yaitu parameter fisik. Intensitas yang dirasakan ditandai oleh tingkat sensasi (SL), yang didefinisikan sebagai jumlah dB di atas nilai minimum deteksi pada frekuensi yang sama.
Amplitudo akselerasi getaran yang sesuai (dalam puncak G) dapat dihitung sebagai berikut:
...dengan dB amplitudo adalah jumlah SL dan nilai minimum deteksi—nilai di sepanjang sumbu vertikal dalam plot yang berdekatan—pada frekuensi tertentu.
Plot yang berdekatan menunjukkan tingkat akselerasi getaran pada 10, 20, 30, 40, dan 50 dB SL, beserta nilai minimum deteksi persepsi haptic manusia (0 dB SL), sebagai fungsi frekuensi temporal. Data ini diperkirakan dari Gambar 8 dalam Verrillo, R. T., et al. tahun 1969, "Sensation magnitude of vibrotactile stimuli.".
Android otomatis menangani konversi ini di BasicEnvelopeBuilder
,
yang mengambil nilai sebagai intensitas ternormalisasi di ruang level sensasi (dB
SL) dan mengonversinya menjadi akselerasi output. Di sisi lain,
WaveformEnvelopeBuilder
tidak menerapkan konversi ini dan mengambil nilai sebagai amplitudo
akselerasi output yang dinormalisasi dalam ruang akselerasi (Gs). Envelope API mengasumsikan bahwa, saat desainer atau developer memikirkan perubahan kekuatan getaran, mereka mengharapkan intensitas yang dirasakan mengikuti envelope linear piecewise.
Penghalusan bentuk gelombang default di perangkat
Sebagai ilustrasi, pertimbangkan bagaimana pola bentuk gelombang kustom berperilaku di perangkat generik:
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));
Plot berikut menunjukkan bentuk gelombang input dan akselerasi output yang sesuai dengan cuplikan kode sebelumnya. Perhatikan bahwa akselerasi bertambah secara bertahap, bukan tiba-tiba, setiap kali ada perubahan langkah amplitudo dalam pola—yaitu, pada 0 mdtk, 150 mdtk, 200 mdtk, 250 mdtk, dan 700 mdtk. Ada juga overshoot pada setiap perubahan langkah amplitudo, dan ada derau yang terlihat yang berlangsung setidaknya 50 md saat amplitudo input tiba-tiba turun ke 0.
Pola haptic yang ditingkatkan
Untuk menghindari overshoot dan mengurangi waktu dering, ubah amplitudo secara lebih bertahap. Berikut ini menunjukkan plot gelombang dan akselerasi dari versi yang direvisi:
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));
Membuat efek haptic yang lebih kompleks
Elemen lain dalam respons klik yang memuaskan lebih rumit, sehingga memerlukan beberapa pengetahuan tentang LRA yang digunakan di perangkat. Untuk hasil terbaik, gunakan bentuk gelombang prafabrikasi perangkat dan konstanta yang disediakan platform, yang memungkinkan Anda melakukan hal berikut:
- Lakukan efek yang jelas dan primitif.
- Gabungkan keduanya untuk membuat efek haptik baru.
Konstanta dan primitif haptik yang telah ditentukan ini dapat sangat mempercepat pekerjaan Anda saat membuat efek haptik berkualitas tinggi.