Semua peningkatan kerangka kerja Android yang dibangun di sekitar haptics didorong oleh serangkaian prinsip UX yang berkembang pada tingkat yang sama. Prinsip-prinsip saat ini melibatkan penggantian getaran buzzy dengan haptics yang jelas , dan menjelajahi haptics yang kaya .
Gambar 1. Prinsip saat ini
Tabel berikut mencantumkan semua API haptics yang tersedia.
API | Metode | Tahun ditambahkan |
---|---|---|
android.view.HapticFeedbackConstants |
| Sebelum 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.Lihat |
| Sebelum 2016 |
android.os.Vibrator |
| Sebelum 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.os.VibrationEffect |
| 2017 (Android 8) |
| 2019 (Android 10) | |
android.os.VibrationEffect.Composition |
| 2020 (Android 11) |
android.media.AudioAttributes.Builder |
| 2019 (Android 10) |
Getaran buzzy
Kembali ke pager dan ponsel berfitur, getaran berbasis buzzer ERM berkualitas rendah namun hemat daya telah digunakan sebagai pengganti dering pendengaran dalam mode senyap . Komponen perangkat keras lama yang menghasilkan suara keras dan tidak menyenangkan yang dapat didengar dapat merusak haptic UX dengan memberikan tayangan berkualitas rendah (misalnya, ponsel murah yang rusak).
Hapus haptik
Haptik yang jelas mendukung sensasi perubahan status diskrit (misalnya, perubahan biner selama proses menghidupkan/mematikan). Karena sifat dari keterjangkauan diskrit , haptic yang jelas dihasilkan sebagai satu kesatuan (misalnya, satu efek haptic per satu kejadian input).
Android bertujuan untuk menghadirkan haptics yang jernih dengan sensasi yang kuat namun tajam, bukan sensasi yang buzzy atau lembek.
Konstanta haptic yang telah ditentukan sebelumnya yang dibuat untuk mendukung haptic yang jelas meliputi yang berikut ini.
-
CLOCK_TICK
-
CONFIRM
-
CONTEXT_CLICK
-
GESTURE_END
-
GESTURE_START
-
KEYBOARD_PRESS
-
KEYBOARD_RELEASE
-
KEYBOARD_TAP
-
LONG_PRESS
-
REJECT
-
TEXT_HANDLE_MOVE
-
VIRTUAL_KEY
-
VIRTUAL_KEY_RELEASE
Dalam VibrationEffect
:
-
EFFECT_CLICK
-
EFFECT_DOUBLE_CLICK
-
EFFECT_HEAVY_CLICK
-
EFFECT_TICK
Membangun pengetahuan umum antara produsen dan pengembang perangkat adalah kunci untuk meningkatkan kualitas haptics secara keseluruhan di ekosistem Android. Gunakan daftar periksa dasar , penilaian perangkat keras , dan CDD . untuk mempelajari lebih lanjut tentang implementasi haptic.
Gambar 3. Menekan dan melepaskan.
Haptik yang kaya
Haptik kaya adalah kategori haptik yang berkembang yang melampaui efek berbasis impuls tunggal. Android bertujuan untuk mendukung haptics yang kaya dengan komposisi dan penyesuaian yang tinggi dengan tingkat perincian yang bagus. Kasus penggunaan berikut didukung di Android 11 atau lebih rendah.
Gambar 4. Haptik yang kaya dengan tekstur geser
Gambar 5. Menyeret dan menggesek
Kasus penggunaan 1: Tekstur geser
Jika efek haptic diulang saat jari meluncur di atas permukaan sentuh (misalnya, menyeret, menggesek, menjelajahi permukaan dengan tekstur haptic phantom), efek haptic berulang lebih disukai tajam dan halus.
Jika efek individualnya berdengung daripada renyah, maka interval antara pengulangan kemungkinan besar akan hilang. Hasilnya adalah satu dengungan panjang, bukan beberapa sinyal terpisah.
Jika amplitudonya tidak cukup halus, maka energi haptic yang dirasakan menumpuk melalui pengulangan, menghasilkan haptic yang sangat kuat di akhir pengulangan.
Menerapkan tekstur haptic permukaan sederhana untuk gerakan menggesek dan menyeret
Gunakan CLOCK_TICK
dan TEXT_HANDLE_MOVE
di HapticFeedbackConstants
. Konstanta ini menentukan karakteristik pengulangan dan amplitudo.
Membuat efek Anda sendiri
Untuk membuat efek Anda sendiri, buat desain dengan merangkai urutan PRIMITIVE_CLICK
dan PRIMITIVE_TICK
di VibrationEffect.Composition
. Anda dapat menyesuaikan karakteristik skala pengulangan dan amplitudo menggunakan addPrimitive(int primitiveID, float scale, int delay)
. Dukungan bergantung pada kemampuan CAP_COMPOSE_EFFECTS
dari Antarmuka HAL Vibrator .
Kasus penggunaan 2: Getaran panjang dengan efek kemudahan
Getaran panjang adalah getaran amplitudo halus yang bertransisi dari 0 ke amplitudo target. Getaran panjang dapat menghasilkan haptics perhatian yang mudah dilihat. Namun, getaran panjang yang tiba-tiba dapat mengejutkan pengguna di lingkungan yang tenang, dan sering kali menghasilkan suara mendengung yang dapat didengar. Untuk menghasilkan getaran panjang yang lebih menyenangkan, terapkan efek easy-in di awal getaran panjang. Ini menghasilkan transisi amplitudo halus yang terbentuk menuju amplitudo target.
Menerapkan efek kemudahan
Periksa kemampuan perangkat keras kontrol amplitudo dengan
android.os.Vibrator.hasAmplitudeControl()
.- Hasilnya harus
true
untuk menghasilkan efek kemudahan dengan amplitudo yang bervariasi.
- Hasilnya harus
Gunakan
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Sesuaikan rangkaian
timings[]
danamplitudes[]
untuk menghasilkan kurva ease-in, seperti yang ditunjukkan pada Gambar 6.
Gambar 6. Kurva kemudahan getaran panjang
Kasus penggunaan 3: Haptik yang digabungkan dengan audio
Audio-coupled haptics adalah pola haptic yang digabungkan dengan ritme audio untuk mendapatkan perhatian pengguna.
Haptik yang digabungkan dengan audio: Manfaat
Untuk menerapkan haptik yang digabungkan dengan audio, gabungkan haptik yang jernih dengan getaran yang panjang. Sensasi haptic yang kuat namun singkat dari haptic yang jernih menghasilkan pola ritmik yang berbeda. Ketika dikombinasikan dengan rangsangan tingkat tinggi yang diberikan oleh getaran yang lama, hal ini berhasil menarik perhatian pengguna.
Sangat penting untuk mempertimbangkan pola ritme sensasi. Jika tidak ada rasa ritme, pengguna merasakan sensasi haptic sebagai dengungan acak, dan cenderung mengabaikannya.
Gambar 7. Contoh haptics pasangan audio
Haptik yang digabungkan dengan audio: Kiat untuk menerapkan
Menerapkan haptic yang digabungkan dengan audio memerlukan pemahaman dasar tentang pemutaran konten saluran audio dan haptic. Ingatlah hal-hal berikut ini.
Gunakan kelas
MediaPlayer
atauSoundPool
.- Aset dalam format OGG dengan kunci metadata khusus (
ANDROID_HAPTIC
diikuti oleh sejumlah saluran haptic) menunjukkan adanya data haptic dan pemutaran denganMediaPlayer
danSoundPool
.
- Aset dalam format OGG dengan kunci metadata khusus (
Tunjukkan dukungan haptics dan pemutaran audio di
audio_policy_configuration.xml
.- Gunakan profil keluaran dengan saluran haptics
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - Untuk aliran keluaran dengan saluran haptic, ingatlah bahwa saluran haptic disajikan sebagai saluran tambahan dalam data.
Contoh
Jika topeng saluran untuk aliran keluaran terlihat seperti ini:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Maka setiap sampel akan terlihat seperti ini:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Gunakan profil keluaran dengan saluran haptics
Ubah
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
ke
false
untuk memutar saluran haptic.- Secara default, saluran haptic dibisukan (
true
). - Kasus penggunaan mencakup nada dering dan suara UI dengan sentuhan dan umpan balik yang sinkron.
- Secara default, saluran haptic dibisukan (
Vibrator HAL harus menerapkan dukungan kontrol eksternal.
- Untuk implementasi HIDL , gunakan
setExternalControl(bool enabled) generates (Status status)
. - Untuk implementasi AIDL , gunakan
void setExternalControl(in boolean enabled)
.
- Untuk implementasi HIDL , gunakan
Gambar 8. Menerapkan haptics yang digabungkan dengan audio
Haptik yang digabungkan dengan audio: Generator Haptic
HapticGenerator
adalah Efek Audio yang diperkenalkan di Android 12 yang dapat menghasilkan data haptic dari saluran audio dan memutarnya secara real time sebagai haptic yang digabungkan dengan audio . Efeknya diterapkan ke AudioTrack
seperti yang dijelaskan pada Gambar 9.
Gambar 9. Arsitektur Haptic Generator
Untuk memastikan algoritme generator haptic Anda menghasilkan haptic berkualitas tinggi, sesuaikan algoritme pembangkitan ke motor vibrator perangkat dengan menyesuaikan parameter yang mengonfigurasi rantai filter yang diterapkan ke bentuk gelombang audio. Bagian ini menjelaskan parameter ini secara rinci, dan menjelaskan cara menyesuaikannya dengan spesifikasi perangkat keras Anda.
Frekuensi resonansi untuk filter band-pass
Frekuensi resonansi vibrator adalah frekuensi di mana aktuator haptic memiliki output maksimum. Parameter ini menyesuaikan anti-resonator untuk meratakan sebagian fungsi transfer respons, untuk mendapatkan bandwidth yang lebih luas. Kerangka kerja Android secara otomatis menautkan nilai ini ke output metode Vibrator HAL
IVibrator.getResonantFrequency
.Nilai default untuk parameter ini adalah 150Hz . Ini dapat dimodifikasi dalam kode di sini .
Daya normalisasi untuk amplop lambat
Parameter ini menentukan eksponen dalam normalisasi parsial (kontrol gain otomatis). Nilai defaultnya adalah -0,8 , yang berarti bahwa 80% variasi rentang dinamis dihilangkan dengan langkah kontrol penguatan ini. Ini dapat dimodifikasi dalam kode di sini .
Faktor Q untuk filter band-stop
Faktor kualitas vibrator (faktor Q) ditentukan oleh dua parameter:
Nol Q, faktor kualitas nol di filter penghenti pita yang sebagian membatalkan resonansi.
Kutub Q, faktor kualitas kutub di filter band-stop.
Rasio kedua nilai tersebut membatasi penekanan resonansi untuk meningkatkan frekuensi yang lebih rendah dan memperluas respons algoritme. Misalnya, nilai default 8 untuk Nol Q dan 4 untuk Kutub Q menghasilkan rasio 2 , membatasi penekanan resonansi dengan faktor 2 (6 dB). Kerangka kerja Android menautkan kedua nilai ke output metode Vibrator HAL
IVibrator.getQFactor
.Jika nilai default tidak memperhitungkan peredam kekuatan motor di perangkat Anda, kami sarankan untuk memodifikasi kedua nilai secara bersamaan, dan meningkatkan keduanya atau mengurangi keduanya. Rasio Nol Q ke Kutub Q harus lebih besar dari 1 . Ini dapat dimodifikasi dalam kode di sini .
Frekuensi sudut untuk distorsi
Frekuensi sudut diterapkan oleh filter low-pass yang menekan getaran tingkat rendah dan meningkatkan tingkat yang lebih tinggi menggunakan distorsi kubik. Ini default ke 300Hz . Ini dapat dimodifikasi dalam kode di sini .
Penguatan input dan ambang kubus untuk distorsi
Parameter ini digunakan oleh filter distorsi nonlinier yang diterapkan pada bentuk gelombang input yang meredam amplitudo sinyal frekuensi rendah dan meningkatkan sinyal frekuensi tinggi.
- Nilai default untuk faktor penguatan input adalah 0,3 .
- Nilai default untuk ambang kubus adalah 0,1 .
Kami merekomendasikan untuk mengubah kedua nilai secara bersamaan. Mereka dapat ditemukan dalam kode di sini .
Untuk informasi lebih lanjut tentang fungsi yang diterapkan oleh filter ini, lihat implementasi yang tersedia di sini . Untuk mempelajari lebih lanjut tentang bagaimana kedua parameter ini memengaruhi output, kami sarankan untuk memplot respons frekuensi filter dan mengamati bagaimana respons frekuensi berubah dengan nilai parameter yang berbeda.
Penguatan keluaran untuk distorsi
Parameter ini mengontrol amplitudo getaran akhir. Ini adalah penguatan terakhir yang diterapkan setelah pembatas lunak yang membatasi amplitudo getaran hingga kurang dari 1. Nilai defaultnya adalah 1,5 , dan dapat dimodifikasi dalam kode di sini . Jika getarannya terlalu halus, tingkatkan nilainya. Jika Anda dapat mendengar perangkat keras aktuator berderak, kurangi nilainya.