Dasar-dasar UX untuk framework haptic

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.

Prinsip UX

Gambar 1. Prinsip saat ini.

Tabel berikut mencantumkan semua API haptik yang tersedia:

API Metode dan konstanta Tahun ditambahkan
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
Sebelum 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Sebelum 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
Sebelum 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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.

Di HapticFeedbackConstants:

  • 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.

Tekan dan Lepaskan

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.

Haptik Lengkap

Gambar 3. Haptik yang kaya dengan tekstur geser.

Menarik dan Menggeser

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

  1. Periksa kemampuan hardware kontrol amplitudo dengan android.os.Vibrator.hasAmplitudeControl().

    • Hasilnya harus true untuk menghasilkan efek mempercepat dengan amplitudo yang bervariasi.
  2. Gunakan VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).

  3. Sesuaikan deret timings[] dan amplitudes[] untuk menghasilkan kurva masuk yang mudah, seperti yang ditunjukkan pada Gambar 5.

Getaran panjang

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.

Pasangan Audio

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 atau SoundPool.

    • Aset dalam format OGG dengan kunci metadata khusus (ANDROID_HAPTIC diikuti dengan jumlah saluran haptik) menunjukkan keberadaan data haptik dan pemutaran dengan MediaPlayer dan SoundPool.
  • 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

  • Ubah AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) menjadi false untuk memutar saluran haptic.

    • Secara default, saluran haptik dibisukan (true).
    • Kasus penggunaan mencakup nada dering dan suara UI dengan haptik dan umpan balik sinkron.
  • HAL Vibrator harus menerapkan dukungan kontrol eksternal.

Haptik yang Digabungkan dengan Audio

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:

Arsitektur Haptic Generator

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.