Semua penyempurnaan framework Android yang dibangun berdasarkan haptics didorong oleh serangkaian prinsip UX yang berkembang dengan kecepatan yang sama. Prinsip-prinsip saat ini melibatkan penggantian getaran buzzy dengan haptik yang jelas , dan mengeksplorasi haptik yang kaya .
Gambar 1. Prinsip-prinsip saat ini
Tabel berikut mencantumkan semua API haptics yang tersedia.
API | Metode | Tahun ditambahkan |
---|---|---|
android.view.HapticFeedbackConstants |
| Sebelum tahun 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.Lihat |
| Sebelum tahun 2016 |
android.os.Vibrator |
| Sebelum tahun 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.os.VibrationEffect |
| 2017 (Android 8) |
| 2019 (Android 10) | |
android.os.VibrationEffect.Komposisi |
| 2020 (Android 11) |
android.media.AudioAttributes.Builder |
| 2019 (Android 10) |
Getaran yang mencengangkan
Sejak zaman pager dan feature phone, 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 dapat membahayakan UX haptik dengan memberikan tayangan berkualitas rendah (misalnya, ponsel murah dan rusak).
Hapus haptik
Haptik yang jelas mendukung sensasi perubahan keadaan diskrit (misalnya, perubahan biner selama proses menghidupkan/mematikan). Karena sifat keterjangkauan diskrit , haptik yang jelas dihasilkan sebagai satu kesatuan (misalnya, satu efek haptik per satu kejadian masukan).
Android bertujuan untuk menghadirkan haptik yang jernih dengan sensasi yang kuat namun tajam, bukan sensasi yang mendengung atau lembek.
Konstanta haptik standar yang dibuat untuk mendukung haptik yang jelas meliputi 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 penerapan haptik.
Gambar 3. Menekan dan melepaskan.
Haptik yang kaya
Haptik yang kaya adalah kategori haptik yang berkembang yang melampaui efek berbasis impuls tunggal. Android bertujuan untuk mendukung haptik yang kaya dengan komposisi dan penyesuaian yang tinggi dengan tingkat perincian yang baik. Kasus penggunaan berikut didukung di Android 11 atau lebih rendah.
Gambar 4. Haptik yang kaya dengan tekstur geser
Gambar 5. Menyeret dan menggeser
Kasus penggunaan 1: Tekstur geser
Jika efek haptik diulangi saat jari meluncur di atas permukaan sentuh (misalnya, menyeret, menggesek, menjelajahi permukaan dengan tekstur haptik bayangan), efek haptik yang berulang sebaiknya tajam dan halus.
Jika efek individualnya lebih menarik daripada tajam, maka interval antar pengulangan kemungkinan besar akan terhapus. Hasilnya adalah satu dengungan panjang, bukan beberapa sinyal terpisah.
Jika amplitudonya tidak cukup halus, maka energi haptik yang dirasakan akan terakumulasi melalui pengulangan, sehingga menghasilkan haptik yang sangat kuat di akhir pengulangan.
Terapkan tekstur haptik permukaan sederhana untuk gerakan menggesek dan menyeret
Gunakan CLOCK_TICK
dan TEXT_HANDLE_MOVE
di HapticFeedbackConstants
. Konstanta ini menentukan karakteristik pengulangan dan amplitudo.
Ciptakan efek Anda sendiri
Untuk membuat efek Anda sendiri, buatlah desain dengan merangkai rangkaian PRIMITIVE_CLICK
dan PRIMITIVE_TICK
dalam 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 yang mudah digunakan
Getaran panjang adalah getaran amplitudo halus yang bertransisi dari 0 ke amplitudo target. Getaran yang panjang dapat menghasilkan haptik perhatian yang mudah dipahami. Namun, getaran panjang yang tiba-tiba dapat mengagetkan pengguna di lingkungan yang sunyi, dan sering kali menimbulkan suara mendengung. Untuk menghasilkan getaran panjang yang lebih menyenangkan, terapkan efek ease-in di awal getaran panjang. Ini menghasilkan transisi amplitudo mulus yang menuju amplitudo target.
Terapkan 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 kemudahan, seperti yang ditunjukkan pada Gambar 6.
Gambar 6. Kurva kemudahan masuk getaran yang 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 yang panjang. Sensasi haptik yang kuat namun singkat dari haptik yang jelas menghasilkan pola ritme yang berbeda. Jika dikombinasikan dengan rangsangan tingkat tinggi yang diberikan oleh getaran panjang, hal ini berhasil menarik perhatian pengguna.
Penting untuk mempertimbangkan pola ritme sensasi. Jika tidak ada ritme, pengguna menganggap sensasi haptik sebagai dengungan acak, dan cenderung mengabaikannya.
Gambar 7. Contoh haptik pasangan audio
Haptik yang digabungkan dengan audio: Kiat untuk menerapkan
Menerapkan haptik yang digabungkan dengan audio memerlukan pemahaman dasar tentang pemutaran konten saluran audio dan haptik. Ingatlah hal-hal berikut ini.
Gunakan kelas
MediaPlayer
atauSoundPool
.- Aset dalam format OGG dengan kunci metadata khusus (
ANDROID_HAPTIC
diikuti sejumlah saluran haptik) menunjukkan keberadaan data haptik 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 haptik, ingatlah bahwa saluran haptik 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)
menjadifalse
untuk memutar saluran haptic.- Secara default, saluran haptik dibisukan (
true
). - Kasus penggunaan mencakup nada dering dan suara UI dengan haptik dan umpan balik yang sinkron.
- Secara default, saluran haptik 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 Haptik
HapticGenerator
adalah Efek Audio yang diperkenalkan di Android 12 yang dapat menghasilkan data haptik dari saluran audio dan memutarnya secara real-time sebagai haptik yang digabungkan dengan audio . Efeknya diterapkan pada AudioTrack
seperti dijelaskan pada Gambar 9.
Gambar 9. Arsitektur Haptic Generator
Untuk memastikan algoritme generator haptik Anda menghasilkan haptik berkualitas tinggi, sesuaikan algoritme pembangkitan ke motor vibrator perangkat dengan menyesuaikan parameter yang mengonfigurasi rangkaian filter yang diterapkan pada 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 haptik memiliki keluaran maksimum. Parameter ini menyesuaikan anti-resonator untuk meratakan sebagian fungsi transfer respons, guna mendapatkan bandwidth yang lebih luas. Framework Android secara otomatis menautkan nilai ini ke output metode HAL HAL
IVibrator.getResonantFrequency
.Nilai default untuk parameter ini adalah 150Hz . Ini dapat dimodifikasi dalam kode di sini .
Kekuatan normalisasi untuk amplop lambat
Parameter ini menentukan eksponen dalam normalisasi parsial (kontrol penguatan otomatis). Nilai defaultnya adalah -0.8 , yang berarti 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 angka nol pada filter band-stop yang menghilangkan sebagian resonansi.
Kutub Q, faktor kualitas kutub pada 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 Nol Q dan 4 untuk Kutub Q menghasilkan rasio 2 , yang membatasi penekanan resonansi sebesar faktor 2 (6 dB). Kerangka kerja Android menghubungkan kedua nilai ke keluaran metode HAL HAL
IVibrator.getQFactor
.Jika nilai default tidak memperhitungkan pengurangan kekuatan motor pada perangkat Anda, sebaiknya ubah kedua nilai secara bersamaan, lalu tingkatkan keduanya atau kurangi 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. Standarnya adalah 300Hz . Ini dapat dimodifikasi dalam kode di sini .
Penguatan input dan ambang batas kubus untuk distorsi
Parameter ini digunakan oleh filter distorsi nonlinier yang diterapkan pada bentuk gelombang masukan yang meredam amplitudo sinyal frekuensi rendah dan meningkatkan amplitudo sinyal frekuensi tinggi.
- Nilai default untuk faktor penguatan masukan 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 keluaran, sebaiknya buat plot respons frekuensi filter dan amati bagaimana respons frekuensi berubah dengan nilai parameter yang berbeda.
Penguatan keluaran untuk distorsi
Parameter ini mengontrol amplitudo getaran akhir. Ini adalah penguatan akhir 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, naikkan nilainya. Jika Anda dapat mendengar suara perangkat keras aktuator, turunkan nilainya.