UX Foundation untuk Kerangka Haptic

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 .

Prinsip UX

Gambar 1. Prinsip saat ini

Tabel berikut mencantumkan semua API haptics yang tersedia.

API Metode 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)
  • KONFIRMASI
  • MENOLAK
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.Lihat
  • melakukanHapticUmpan Balik()
Sebelum 2016
android.os.Vibrator
  • bergetar()
  • memilikiVibrator()
Sebelum 2016
  • memilikiAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsDidukung()
  • arePrimitivesDidukung()
2020 (Android 11)
android.os.VibrationEffect
  • buatOneShot()
  • buatBentuk Gelombang()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • buat yang telah ditentukan ()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • tambahkanPrimitif()
  • menyusun()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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.

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

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.

Tekan dan lepaskan

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.

Kaya Haptik

Gambar 4. Haptik yang kaya dengan tekstur geser

Menyeret dan Menggesek

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

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

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

  3. Sesuaikan rangkaian timings[] dan amplitudes[] untuk menghasilkan kurva ease-in, seperti yang ditunjukkan pada Gambar 6.

Getaran Panjang

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.

Pasangan Audio

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

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

  • 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.
  • Vibrator HAL harus menerapkan dukungan kontrol eksternal.

Audio Gabungan Haptik

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.

Haptic Generator architecture

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.

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

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

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

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

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

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