Semua peningkatan framework Android yang dibuat berdasarkan haptic didorong oleh serangkaian prinsip UX yang berkembang dengan kecepatan yang sama. Prinsip saat ini melibatkan penggantian getaran berdengung dengan haptik yang jelas, dan menjelajahi haptik yang kaya.
Gambar 1. Prinsip saat ini
Tabel berikut mencantumkan semua API haptik yang tersedia.
API | Metode | 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 berdengung
Sejak dari pager dan ponsel fitur, getaran berbasis buzzer ERM berkualitas rendah tetapi hemat daya telah digunakan sebagai pengganti dering audio dalam mode senyap. Komponen hardware lama yang menghasilkan suara bising dan tidak menyenangkan yang dapat didengar dapat membahayakan UX haptik dengan memberikan tayangan berkualitas rendah (misalnya, ponsel murah yang rusak).
Hapus haptic
haptic yang jelas mendukung sensasi perubahan status terpisah (misalnya, perubahan biner selama proses pengaktifan/penonaktifan). Karena sifat affordance diskret, haptic yang jelas dihasilkan sebagai satu entitas (misalnya, satu efek haptic per satu peristiwa input).
Android bertujuan untuk memberikan haptic yang jelas dengan sensasi yang kuat, tetapi tajam, bukan sensasi yang berdengung atau kabur.
Konstanta haptic standar yang dibuat untuk mendukung haptic yang jelas mencakup hal 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 di ekosistem Android. Gunakan checklist dasar, penilaian hardware, dan CDD. untuk mempelajari penerapan haptic lebih lanjut.
Gambar 3. Menekan dan melepas.
Haptic yang kaya
Haptik yang kaya adalah kategori haptik yang berkembang yang melampaui efek berbasis impuls tunggal. Android bertujuan untuk mendukung haptic yang kaya dengan komposabilitas dan penyesuaian yang tinggi dengan tingkat perincian yang baik. Kasus penggunaan berikut didukung di Android 11 atau yang lebih rendah.
Gambar 4. Haptik yang kaya dengan tekstur geser
Gambar 5. Menarik dan menggeser
Kasus penggunaan 1: Tekstur bergeser
Jika efek haptic diulang saat jari bergeser di atas permukaan sentuh (misalnya, menarik, menggeser, menjelajahi permukaan dengan tekstur haptic phantom), sebaiknya efek haptic berulang tajam dan halus.
Jika efek individual berdengung, bukan jernih, interval antara pengulangan kemungkinan akan dihapus. Hasilnya adalah satu derau panjang, bukan beberapa sinyal terpisah.
Jika amplitudo tidak cukup halus, energi haptik yang dirasakan akan menumpuk melalui pengulangan, sehingga menghasilkan haptic yang sangat kuat di akhir pengulangan.
Mengimplementasikan tekstur haptic permukaan sederhana untuk gestur geser dan tarik
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, tulis desain dengan merangkai urutan
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
Vibrator HAL Interface.
Kasus penggunaan 2: Getaran panjang dengan efek kemudahan
Getaran panjang adalah getaran amplitudo halus yang bertransisi dari 0 ke amplitudo target. Getaran yang lama dapat menghasilkan haptik perhatian yang mudah dipahami. Namun, getaran panjang yang tiba-tiba dapat mengejutkan pengguna di lingkungan yang tenang, dan sering kali menghasilkan suara dengung yang terdengar. Untuk menghasilkan vibrasi lama yang lebih menyenangkan, terapkan efek ease-in di awal vibrasi lama. Hal ini menghasilkan transisi amplitudo yang halus yang mengarah ke amplitudo target.
Menerapkan efek ease-in
Periksa kemampuan hardware kontrol amplitudo dengan
android.os.Vibrator.hasAmplitudeControl()
.- Hasilnya harus
true
untuk menghasilkan efek ease-in dengan amplitudo yang bervariasi.
- Hasilnya harus
Gunakan
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Sesuaikan deret
timings[]
danamplitudes[]
untuk menghasilkan kurva ease-in, seperti yang ditunjukkan pada Gambar 6.
Gambar 6. Kurva ease-in 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.
Haptic yang digabungkan dengan audio: Manfaat
Untuk menerapkan haptic yang digabungkan dengan audio, gabungkan haptic yang jelas dengan getaran panjang. Sensasi haptic yang kuat tetapi singkat dari haptic yang jelas memberikan pola ritmis yang terpisah. Jika dikombinasikan dengan tingkat rangsangan tinggi yang diberikan getaran panjang, hal ini akan sangat menarik perhatian pengguna.
Penting untuk mempertimbangkan pola ritmis sensasi. Jika tidak ada ritme, pengguna akan merasakan sensasi haptik sebagai dengungan acak, dan cenderung mengabaikannya.
Gambar 7. Contoh haptik pasangan audio
Haptik yang digabungkan dengan audio: Tips untuk menerapkan
Mengimplementasikan haptic yang disambungkan dengan audio memerlukan pemahaman dasar tentang pemutaran konten dari saluran audio dan haptic. Perhatikan hal-hal berikut.
Gunakan class
MediaPlayer
atauSoundPool
.- Aset dalam format OGG dengan kunci metadata khusus
(
ANDROID_HAPTIC
diikuti dengan sejumlah saluran haptik) menunjukkan adanya data haptik dan pemutaran denganMediaPlayer
danSoundPool
.
- Aset dalam format OGG dengan kunci metadata khusus
(
Menunjukkan dukungan haptic dan pemutaran audio di
audio_policy_configuration.xml
.- Gunakan profil output dengan saluran haptik
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - Untuk aliran output dengan saluran haptik, ingat bahwa saluran haptik ditampilkan sebagai saluran tambahan dalam data.
Contoh
Jika mask saluran untuk aliran output 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 output dengan saluran haptik
Ubah
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
kefalse
untuk memutar saluran haptic.- Secara default, saluran haptic dibisukan (
true
). - Kasus penggunaan mencakup nada dering dan suara UI dengan haptik dan masukan sinkron.
- Secara default, saluran haptic dibisukan (
HAL Vibrator harus mengimplementasikan dukungan kontrol eksternal.
- Untuk penerapan HiDL, gunakan
setExternalControl(bool enabled) generates (Status status)
. - Untuk implementasi AIDL, gunakan
void setExternalControl(in boolean enabled)
.
- Untuk penerapan HiDL, gunakan
Gambar 8. Mengimplementasikan haptik yang digabungkan dengan audio
Haptic 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 haptik yang digabungkan dengan audio.
Efek diterapkan ke AudioTrack
seperti yang dijelaskan pada Gambar 9.
Gambar 9. Arsitektur Generator Haptic
Untuk memastikan algoritma generator haptik Anda menghasilkan haptik berkualitas tinggi, sesuaikan algoritma pembuatan ke motor vibrator perangkat dengan menyesuaikan parameter yang mengonfigurasi rantai filter yang diterapkan ke bentuk gelombang audio. Bagian ini menjelaskan parameter ini secara mendetail, dan menjelaskan cara menyesuaikannya dengan spesifikasi hardware Anda.
Frekuensi resonan 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 agar mendapatkan bandwidth yang lebih luas. Framework Android secara otomatis menautkan nilai ini ke output metode HAL Vibrator
IVibrator.getResonantFrequency
.Nilai default untuk parameter ini adalah 150 Hz. Hal ini dapat diubah dalam kode di sini.
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 dihapus oleh langkah kontrol penguatan ini. Hal ini dapat diubah dalam kode di sini.
Faktor Q untuk filter band-stop
Faktor kualitas (faktor Q) vibrator ditentukan oleh dua parameter:
Zero Q, faktor kualitas nol dalam filter band-stop yang sebagian membatalkan resonansi.
Pole Q, faktor kualitas kutub dalam filter band-stop.
Rasio kedua nilai tersebut membatasi penyembunyian resonansi untuk meningkatkan frekuensi yang lebih rendah dan memperluas respons algoritme. Misalnya, nilai default 8 untuk Zero Q dan 4 untuk Kutub Q menghasilkan rasio 2, yang membatasi penyembunyian resonansi dengan faktor 2 (6 dB). Framework Android menautkan kedua nilai ke output metode HAL Vibrator
IVibrator.getQFactor
.Jika nilai default tidak memperhitungkan redaman kekuatan motor di perangkat, sebaiknya ubah kedua nilai secara bersamaan, dan tingkatkan keduanya atau kurangi keduanya. Rasio Zero Q terhadap Pole Q harus lebih besar dari 1. Hal ini dapat diubah 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. Setelan defaultnya adalah 300 Hz. Hal ini dapat diubah dalam kode di sini.
Gain input dan nilai minimum kubus untuk distorsi
Parameter ini digunakan oleh filter distorsi nonlinear yang diterapkan pada bentuk gelombang input yang meredam amplitudo sinyal frekuensi yang lebih rendah dan meningkatkan amplitudo sinyal frekuensi yang lebih tinggi.
- Nilai default untuk faktor penguatan input adalah 0,3.
- Nilai default untuk nilai minimum kubus adalah 0,1.
Sebaiknya ubah kedua nilai secara bersamaan. Kode tersebut dapat ditemukan di kode di sini.
Untuk informasi selengkapnya tentang fungsi yang diterapkan oleh filter ini, lihat penerapan yang tersedia di sini. Untuk mempelajari lebih lanjut pengaruh kedua parameter ini terhadap output, sebaiknya rencanakan respons frekuensi filter dan amati bagaimana respons frekuensi berubah dengan parameter value yang berbeda.
Penguatan output untuk distorsi
Parameter ini mengontrol amplitudo getaran akhir. Ini adalah penguatan akhir yang diterapkan setelah soft limiter yang membatasi amplitudo getaran menjadi kurang dari 1. Nilai defaultnya adalah 1.5, dan dapat diubah dalam kode di sini. Jika getaran terlalu halus, tingkatkan nilainya. Jika Anda bisa mendengar derau hardware aktuator, kurangi nilainya.