Semua peningkatan framework Android yang dibangun di sekitar haptik didorong oleh serangkaian prinsip UX yang berkembang dengan kecepatan yang sama. Prinsip saat ini melibatkan penggantian getaran berdengung dengan haptics yang jelas, dan mengeksplorasi haptics yang kaya.
Gambar 1. Prinsip saat ini.
Tabel berikut mencantumkan semua API haptik yang tersedia:
API | Metode dan konstanta | Tahun ditambahkan |
---|---|---|
android.view.HapticFeedbackConstants |
|
Sebelum 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.View |
|
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 berdesing
Sejak pager dan ponsel menengah, getaran berbasis buzzer yang berkualitas rendah, tetapi hemat daya dengan massa berputar eksentrik (ERM) telah digunakan sebagai pengganti dering audio dalam mode senyap. Komponen hardware lama yang menghasilkan suara keras dan tidak menyenangkan dapat merusak UX haptik dengan memberikan kesan berkualitas rendah (misalnya, ponsel murah yang rusak).
Haptik yang jelas
Haptik jelas mendukung sensasi perubahan status diskret (misalnya, perubahan biner selama proses menyalakan dan mematikan). Karena sifat dari kemampuan diskret, haptik yang jelas dihasilkan sebagai satu entitas (misalnya, satu efek haptik per satu peristiwa input).
Android bertujuan untuk memberikan haptik yang jelas dengan sensasi yang kuat, tetapi tajam, bukan sensasi yang bergetar atau lembek.
Konstanta haptik yang telah ditentukan sebelumnya dan dibuat untuk mendukung haptik yang jelas mencakup elemen berikut.
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
Di
VibrationEffect
:
EFFECT_CLICK
EFFECT_DOUBLE_CLICK
EFFECT_HEAVY_CLICK
EFFECT_TICK
Membangun pengetahuan umum antara produsen perangkat dan developer adalah kunci untuk meningkatkan kualitas haptik secara keseluruhan dalam ekosistem Android. Gunakan checklist dasar, penilaian hardware, dan CDD. untuk mempelajari lebih lanjut penerapan haptik.
Gambar 2. Menekan dan melepaskan.
Haptik kaya
Haptik kaya adalah kategori haptik yang terus berkembang dan melampaui efek berbasis impuls tunggal. Android bertujuan untuk mendukung haptik yang kaya dengan kompositabilitas dan kemampuan penyesuaian yang tinggi dengan tingkat perincian yang baik. Kasus penggunaan berikut didukung di Android 11 atau yang lebih rendah.
Gambar 3. Haptik yang kaya dengan tekstur geser.
Gambar 4. Menarik dan menggeser.
Kasus penggunaan 1: Tekstur geser
Jika efek haptik diulang saat jari meluncur di atas permukaan sentuh (misalnya, menarik, menggeser, menjelajahi permukaan dengan tekstur haptik fantom), efek haptik yang berulang sebaiknya jelas dan halus.
Jika efek individu berisik, bukan jernih, maka interval di antara pengulangan kemungkinan akan hilang. Hasilnya adalah dering panjang, bukan beberapa sinyal terpisah.
Jika amplitudo tidak cukup halus, energi haptik yang dirasakan akan meningkat melalui pengulangan, sehingga menghasilkan haptik yang sangat kuat di akhir pengulangan.
Menerapkan tekstur haptik permukaan untuk gestur menggeser dan menarik
Gunakan CLOCK_TICK
dan TEXT_HANDLE_MOVE
di HapticFeedbackConstants
.
Konstanta ini telah menentukan karakteristik pengulangan dan amplitudo.
Membuat efek Anda sendiri
Untuk membuat efek Anda sendiri, susun desain dengan merangkai urutan
PRIMITIVE_CLICK
dan PRIMITIVE_TICK
di VibrationEffect.Composition
.
Anda dapat menyesuaikan karakteristik pengulangan dan skala 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 percepatan
Getaran panjang adalah getaran amplitudo halus yang bertransisi dari 0 ke amplitudo target. Getaran panjang dapat menghasilkan haptik perhatian yang dapat dirasakan. Namun, getaran panjang yang tiba-tiba dapat mengejutkan pengguna di lingkungan yang tenang, dan sering kali menghasilkan suara dengungan yang terdengar. Untuk menghasilkan getaran panjang yang lebih menyenangkan, terapkan efek percepatan di awal getaran panjang. Hal ini menghasilkan transisi amplitudo yang lancar yang dibangun menuju amplitudo target.
Menerapkan efek percepatan
Periksa kemampuan hardware kontrol amplitudo dengan
android.os.Vibrator.hasAmplitudeControl()
.- Hasilnya harus
true
untuk menghasilkan efek mempercepat dengan amplitudo yang bervariasi.
- Hasilnya harus
Gunakan
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Sesuaikan deret
timings[]
danamplitudes[]
untuk menghasilkan kurva masuk yang mudah, seperti yang ditunjukkan pada Gambar 5.
Gambar 5. Kurva percepatan getaran panjang.
Kasus penggunaan 3: Haptik yang digabungkan dengan audio
Haptik yang digabungkan dengan audio adalah pola haptik yang digabungkan dengan ritme audio untuk menarik perhatian pengguna.
Haptik yang digabungkan dengan audio: Manfaat
Untuk menerapkan haptik yang digabungkan dengan audio, gabungkan haptik yang jelas dengan getaran panjang. Sensasi haptik yang kuat tetapi singkat dari haptik yang jelas menghasilkan pola ritmik yang berbeda. Jika dikombinasikan dengan tingkat stimulasi tinggi yang diberikan oleh getaran panjang, hal ini akan sangat efektif untuk menarik perhatian pengguna.
Penting untuk mempertimbangkan pola ritmik sensasi. Jika tidak ada rasa ritme, pengguna akan menganggap sensasi haptik sebagai getaran acak, dan cenderung mengabaikannya.
Gambar 6. Contoh haptik yang digabungkan dengan audio.
Haptik yang digabungkan dengan audio: Tips untuk menerapkan
Penerapan haptik yang digabungkan dengan audio memerlukan pemahaman dasar tentang pemutaran konten saluran audio dan haptik. Perhatikan hal-hal berikut:
Gunakan class
MediaPlayer
atauSoundPool
.- Aset dalam format OGG dengan kunci metadata khusus
(
ANDROID_HAPTIC
diikuti dengan jumlah saluran haptik) menunjukkan keberadaan data haptik dan pemutaran denganMediaPlayer
danSoundPool
.
- Aset dalam format OGG dengan kunci metadata khusus
(
Menunjukkan dukungan pemutaran audio dan haptik di
audio_policy_configuration.xml
.- Gunakan profil output dengan saluran haptik
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - Untuk aliran output dengan saluran haptik, ingatlah bahwa saluran haptik ditampilkan sebagai saluran tambahan dalam data.
Contoh
Jika mask channel untuk aliran output terlihat seperti ini:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Kemudian, setiap sampel akan terlihat seperti ini:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Gunakan profil output dengan saluran haptik
Ubah
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
menjadifalse
untuk memutar saluran haptic.- Secara default, saluran haptik dibisukan (
true
). - Kasus penggunaan mencakup nada dering dan suara UI dengan haptik dan umpan balik sinkron.
- Secara default, saluran haptik dibisukan (
HAL Vibrator harus menerapkan dukungan kontrol eksternal.
- Untuk penerapan HIDL, gunakan
setExternalControl(bool enabled) generates (Status status)
. - Untuk penerapan AIDL, gunakan
void setExternalControl(in boolean enabled)
.
- Untuk penerapan HIDL, gunakan
Gambar 7. Menerapkan haptik yang digabungkan dengan audio.
Haptik yang digabungkan dengan audio: HapticGenerator
HapticGenerator
adalah efek audio yang diperkenalkan di Android 12 yang
dapat menghasilkan data sentuhan dari saluran audio dan memutarnya secara real time sebagai
sentuhan yang digabungkan dengan audio. Efek diterapkan ke AudioTrack
seperti
yang diilustrasikan dalam Gambar 8:
Gambar 8. Arsitektur Haptic Generator.
Visualisasi arsitektur ini menunjukkan tempat Penerapan Haptic Generator pada
streaming audio pengguna yang masuk sebelum dikirim ke HAL Audio. Generator diterapkan setelah AudioMixer
memisahkan data audio dan haptik serta sebelum efek audio lainnya, dan outputnya menggantikan data haptik sebelumnya dalam aliran.
Untuk memastikan algoritma generator haptik Anda menghasilkan haptik berkualitas tinggi, sesuaikan algoritma pembuatan ke motor vibrator perangkat dengan menyesuaikan parameter yang mengonfigurasi rangkaian filter yang diterapkan ke bentuk gelombang audio. Bagian ini menjelaskan parameter ini secara mendetail, dan menjelaskan cara menyesuaikannya dengan spesifikasi hardware Anda.
Frekuensi resonansi untuk filter band-pass
Frekuensi resonansi vibrator adalah frekuensi saat aktuator haptik memiliki output maksimum. Parameter ini menyesuaikan anti-resonator untuk meratakan sebagian fungsi transfer respons, guna mendapatkan bandwidth yang lebih lebar. Framework Android secara otomatis menautkan nilai ini ke output metode HAL Vibrator
IVibrator.getResonantFrequency
.Nilai default untuk parameter ini adalah 150 Hz. Anda dapat mengubahnya di kode.
Daya normalisasi untuk amplop lambat
Parameter ini menentukan eksponen dalam normalisasi parsial (kontrol penguatan otomatis). Nilai defaultnya adalah -0,8, yang berarti bahwa 80% variasi rentang dinamis dihilangkan oleh langkah kontrol gain ini. Anda dapat mengubahnya di kode.
Faktor Q untuk filter band-stop
Faktor kualitas vibrator (faktor Q) ditentukan oleh dua parameter:
Q Nol, faktor kualitas nol dalam filter band-stop yang membatalkan resonansi sebagian
Pole Q, faktor kualitas kutub dalam filter band-stop
Rasio kedua nilai tersebut membatasi penekanan resonansi untuk meningkatkan frekuensi yang lebih rendah dan memperluas respons algoritma. Misalnya, nilai default 8 untuk Q Nol dan 4 untuk Q Kutub menghasilkan rasio 2, yang membatasi peredaman resonansi dengan faktor 2 (6 dB). Framework Android menautkan kedua nilai ke output metode Vibrator HAL
IVibrator.getQFactor
.Jika nilai default tidak memperhitungkan peredaman kekuatan motor di perangkat Anda, sebaiknya ubah kedua nilai secara bersamaan, dan naikkan atau turunkan keduanya. Rasio Q Nol terhadap Q Kutub harus lebih besar dari 1. Anda dapat mengubahnya di kode.
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. Nilai defaultnya adalah 300 Hz. Anda dapat mengubahnya di kode.
Penguatan input dan nilai minimum kubus untuk distorsi
Parameter ini digunakan oleh filter distorsi non-linear yang diterapkan pada bentuk gelombang input yang meredam amplitudo sinyal frekuensi rendah dan meningkatkan amplitudo sinyal frekuensi tinggi.
- Nilai default untuk faktor perolehan input adalah 0.3.
- Nilai default untuk nilai minimum kubus adalah 0,1.
Sebaiknya ubah kedua nilai secara bersamaan. Elemen tersebut dapat ditemukan di kode.
Untuk mengetahui informasi selengkapnya tentang fungsi yang diterapkan oleh filter ini, lihat penerapan dalam kode.
Untuk mempelajari lebih lanjut pengaruh kedua parameter ini terhadap output, sebaiknya buat plot respons frekuensi filter dan amati perubahan respons frekuensi dengan nilai parameter yang berbeda.
Penguatan output untuk distorsi
Parameter ini mengontrol amplitudo getaran akhir. Ini adalah perolehan akhir yang diterapkan setelah pembatas lembut yang membatasi amplitudo getaran menjadi kurang dari 1. Nilai defaultnya adalah 1,5, dan Anda dapat mengubahnya di kode.
Jika getaran terlalu halus, tingkatkan nilainya. Jika Anda dapat mendengar suara berderak dari hardware aktuator, kurangi nilainya.