Fondasi UX untuk framework haptic

Semua peningkatan framework Android yang dibangun berdasarkan haptic didorong oleh seperangkat prinsip UX yang berkembang pada kecepatan yang sama. Saat ini prinsip terkait mengganti getaran bergetar dengan haptic yang jelas, dan dan menjelajahi haptic yang kaya.

Prinsip UX

Gambar 1. Prinsip saat ini

Tabel berikut mencantumkan semua API haptics yang tersedia.

API Metode Tahun ditambahkan
android.view.HapticFeedbackConstants
  • KONTEKS_KLIK
  • JAM_TIK
  • KUNCI_VIRTUAL
  • KETUK_KEYBOARD
  • PANJANG_TEKAN
Sebelum 2016
  • KEYBOARD_PRESS
  • RILIS_KEY
  • TEXT_HANDLE_MOVE
  • RILIS_KUNCI_VIRTUAL
2017 (Android 8)
  • KONFIRMASI
  • TOLAK
  • GESTURE_MULAI
  • GESTURE_END
2020 (Android 11)
Tampilan Android
  • performHapticFeedback()
Sebelum 2016
android.os.Vibrator
  • getar()
  • hasVibrator()
Sebelum 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesDidukung()
  • areEffectssupported()
  • arePrimitivesDidukung()
2020 (Android 11)
android.os.GetaranEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EKSKLUSIF
  • EFEK_KLIK
  • KLIK_BERAT_DAMPAK
  • Efek_Double_KLIK
  • createStandar()
2019 (Android 10)
android.os.GetbrationEffect.Composition
  • TITIK_PRIMITIF
  • KLIK_PRIMITIF
  • addPrimitive()
  • {i>compose()<i}
2020 (Android 11)
android.media.AudioAttributes.Builder
  • {i>setHapticChannelsmuted()<i}
2019 (Android 10)

Getaran bergetar

Kembali ke pager dan ponsel menengah, ERM berkualitas rendah tetapi hemat daya Getaran berbasis suara telah digunakan sebagai pengganti dering suara mode senyap. Komponen hardware lama yang menghasilkan suara derau yang terdengar dapat membahayakan UX haptik dengan mengirimkan tayangan iklan berkualitas rendah (untuk misalnya, ponsel yang murah dan rusak).

Hapus haptic

haptic yang jelas mendukung sensasi perubahan status terpisah (misalnya, perubahan biner selama proses menyalakan/mematikan). Karena sifat Kemampuan terpisah, haptic yang jelas dihasilkan sebagai entitas tunggal (untuk misalnya, satu efek haptic per satu peristiwa input).

Android bertujuan untuk memberikan haptic yang jelas dengan sensasi kuat, namun tajam daripada sensasi yang bergetar atau lembek.

Konstanta haptic yang telah ditentukan sebelumnya yang dibuat untuk mendukung haptic yang jelas mencakup berikut ini.

Di dalam 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 dalam VibrationEffect

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

Membangun pengetahuan bersama antara produsen perangkat dan developer adalah kunci untuk meningkatkan kualitas haptic secara keseluruhan di ekosistem Android. Gunakan checklist dasar, penilaian hardware, dan CDD. untuk mempelajari lebih lanjut implementasi haptic.

Pers dan Rilis

Gambar 3. Menekan dan melepaskannya.

Haptic yang kaya

Multi-haptic yang kaya adalah kategori haptic yang terus berkembang yang lebih dari sekadar haptic tunggal efek berbasis impuls. Android bertujuan untuk mendukung haptic yang kaya dengan komposabilitas dan penyesuaian dengan tingkat perincian yang baik. Hal berikut kasus penggunaan didukung di Android 11 atau yang lebih rendah.

Haptic Kaya

Gambar 4. Haptic kaya dengan tekstur geser

Menarik dan Menggeser

Gambar 5. Menarik dan menggeser

Kasus penggunaan 1: Tekstur bergeser

Jika efek haptic diulang saat jari meluncur di atas permukaan sentuh (untuk misalnya, menarik, menggeser, menjelajahi permukaan dengan tekstur haptic hantu), efek haptik berulang sebaiknya tajam dan halus.

Jika efek individualnya bergetar dan bukan tajam, maka interval antara pengulangan kemungkinan akan terhapus. Hasilnya adalah sebuah peristiwa yang panjang, bukan daripada beberapa sinyal diskrit.

Jika amplitudo tidak cukup halus, energi haptik yang dirasakan akan menumpuk melalui pengulangan, yang 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 terlebih dahulu karakteristik pengulangan dan amplitudo.

Buat efek Anda sendiri

Untuk membuat efek Anda sendiri, buat desain dengan merangkai urutan dari PRIMITIVE_CLICK dan PRIMITIVE_TICK inci VibrationEffect.Composition Anda dapat menyesuaikan karakteristik skala pengulangan dan amplitudo menggunakan addPrimitive(int primitiveID, float scale, int delay). Dukungan bergantung pada tindakan CAP_COMPOSE_EFFECTS kemampuan Antarmuka Vibrator HAL.

Kasus penggunaan 2: Getaran panjang dengan efek kemudahan

Getaran panjang adalah getaran amplitudo halus yang bertransisi dari 0 ke amplitudo target. Getaran lama dapat menghasilkan atensi yang mudah dilihat haptic. Namun, getaran lama yang tiba-tiba dapat mengejutkan pengguna lingkungan, dan biasanya menghasilkan suara dengungan yang dapat didengar. Untuk membuat getaran panjang yang menyenangkan, terapkan efek easy-in di awal durasi getaran. Ini menghasilkan transisi amplitudo halus yang mengarah ke amplitudo target.

Terapkan efek {i>easing-in<i}

  1. Periksa kemampuan hardware 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 seperti yang ditunjukkan pada Gambar 6.

Getaran Lama

Gambar 6. Kurva kemudahan getaran panjang

Kasus penggunaan 3: Haptic yang digabungkan audio

haptic yang digabungkan dengan audio adalah pola haptik yang digabungkan dengan ritme audio untuk mendapatkan perhatian pengguna.

Haptic yang digabungkan dengan audio: Manfaat

Untuk menerapkan haptic yang digabungkan dengan audio, gabungkan haptic yang jelas dengan getaran panjang. Sensasi haptik yang kuat namun singkat dari haptic yang jelas menghasilkan pola ritmis. Ketika dikombinasikan dengan tingkat stimulus tinggi yang lama memberikan getaran, ini pekerjaan yang baik untuk menarik perhatian pengguna.

Penting untuk mempertimbangkan pola ritmis sensasi. Jika tidak masuk akal, ritme, pengguna merasakan sensasi haptik sebagai getaran acak, dan cenderung untuk mengabaikannya.

Pasangan Audio

Gambar 7. Contoh haptic pasangan audio

Haptic yang digabungkan audio: Tips untuk mengimplementasikan

Menerapkan haptic yang digabungkan dengan audio memerlukan pemahaman dasar tentang konten pemutaran saluran audio dan haptic. Ingatlah hal-hal berikut.

  • Menggunakan MediaPlayer atau SoundPool Google Cloud Platform.

    • Aset dalam format OGG dengan kunci metadata khusus (ANDROID_HAPTIC diikuti dengan sejumlah saluran haptic) menunjukkan adanya data haptic dan pemutaran dengan MediaPlayer dan SoundPool.
  • Menunjukkan dukungan haptic dan pemutaran audio di audio_policy_configuration.xml.

    • Menggunakan profil output dengan saluran haptic AUDIO_CHANNEL_OUT_HAPTIC_A|B.
    • Untuk streaming output dengan saluran haptic, ingatlah bahwa fungsi haptic saluran disajikan sebagai saluran tambahan dalam data.

    Contoh

    Jika mask channel untuk streaming 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

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

Haptik Gabungan Audio

Gambar 8. Mengimplementasikan haptic yang digabungkan dengan audio

Haptic yang digabungkan dengan audio: Generator Haptic

HapticGenerator adalah Efek Audio diperkenalkan di Android 12 yang dapat menghasilkan data haptik dari saluran audio dan memutarnya secara real time sebagai haptic yang digabungkan audio. Efek diterapkan ke AudioTrack seperti yang dijelaskan dalam Gambar 9.

Arsitektur Generator Haptic

Gambar 9. Arsitektur Generator Haptic

Untuk memastikan algoritme generator haptic Anda menghasilkan haptic berkualitas tinggi, setel algoritma pembangkitan ke motor vibrator perangkat dengan menyesuaikan parameter yang mengonfigurasi rantai filter yang diterapkan pada bentuk gelombang audio. Bagian ini menjelaskan parameter tersebut secara mendetail dan menjelaskan cara menyesuaikannya sesuai spesifikasi hardware Anda.

  1. Frekuensi resonan untuk filter band-pass

    Frekuensi resonansi vibrator adalah frekuensi saat aktuator haptik memiliki {i>output<i} maksimum. Parameter ini menyesuaikan anti-resonator menjadi sebagian meratakan fungsi transfer respons, untuk mendapatkan {i>bandwidth<i} 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. Fungsi ini dapat diubah di kode di sini.

  2. 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 dihapus oleh langkah kontrol peningkatan ini. Ini dapat diubah dalam kode di sini.

  3. Faktor Q untuk filter band-stop

    Faktor kualitas penggetar (faktor Q) ditentukan oleh dua parameter:

    • {i>Zero Q<i}, faktor kualitas dari nol dalam filter {i>band-stop<i} yang sebagian membatalkan resonansi.

    • Kutub Q, faktor kualitas kutub dalam filter {i>band-stop<i}.

    Rasio kedua nilai tersebut membatasi penyembunyian resonansi secara berurutan untuk meningkatkan frekuensi yang lebih rendah dan memperluas respons algoritma. Misalnya, nilai default 8 untuk Zero Q dan 4 untuk Pole Q menghasilkan rasio 2, yang membatasi penyembunyian resonansi dengan faktor 2 (6 dB). Framework Android menautkan kedua nilai ke output Vibrator HAL IVibrator.getQFactor.

    Jika nilai default tidak memperhitungkan redaman kekuatan motorik di perangkat, sebaiknya ubah kedua nilai sekaligus, dan meningkatkan keduanya atau mengurangi keduanya. Rasio Zero Q terhadap Kutub Q harus lebih besar dari 1. Ini dapat diubah dalam kode di sini.

  4. Frekuensi sudut untuk distorsi

    Frekuensi sudut diterapkan oleh filter low-pass yang menekan getaran tingkat rendah dan meningkatkan level yang lebih tinggi menggunakan distorsi kubik. Setelan defaultnya adalah 300 Hz. Ini dapat diubah dalam kode di sini.

  5. Penguatan 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 akan meningkatkan frekuensi yang lebih tinggi.

    • Nilai default untuk faktor penguatan input adalah 0.3.
    • Nilai default untuk ambang batas kubus adalah 0.1.

    Sebaiknya ubah kedua nilai secara bersamaan. Dapat ditemukan dalam kode di sini.

    Untuk informasi selengkapnya tentang fungsi yang diterapkan oleh filter ini, lihat penerapan yang tersedia tersedia di sini. Untuk mempelajari lebih lanjut tentang bagaimana kedua parameter ini mempengaruhi output, kita sebaiknya merencanakan respons frekuensi filter tersebut dan mengamati respons frekuensi berubah dengan parameter value yang berbeda.

  6. Penguatan output untuk distorsi

    Parameter ini mengontrol amplitudo getaran akhir. Merupakan keuntungan akhir diterapkan setelah pembatas lembut yang membatasi amplitudo getaran ke tingkat yang lebih rendah dari 1. Nilai defaultnya adalah 1.5, dan dapat diubah di kode di sini. Jika getarannya terlalu halus, tingkatkan nilainya. Jika Anda dapat mendengar getaran perangkat keras aktuator, kurangi nilainya.