Fondasi UX untuk framework haptic

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.

Prinsip UX

Gambar 1. Prinsip saat ini

Tabel berikut mencantumkan semua API haptik yang tersedia.

API Metode Tahun ditambahkan
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • PANJANG_TEKAN
Sebelum 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • KONFIRMASI
  • TOLAK
  • 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
  • EFEK_KLIK
  • EFFECT_HEAVY_CLICK
  • Efek_Double_KLIK
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • KLIK_PRIMITIF
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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.

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 di ekosistem Android. Gunakan checklist dasar, penilaian hardware, dan CDD. untuk mempelajari penerapan haptic lebih lanjut.

Pers dan Rilis

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.

Haptik yang Kaya

Gambar 4. Haptik yang kaya dengan tekstur geser

Menarik dan Menggeser

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

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

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

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

Getaran Panjang

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.

Pasangan Audio

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

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

  • 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 haptik dan masukan sinkron.
  • HAL Vibrator harus mengimplementasikan dukungan kontrol eksternal.

Haptik yang Dikaitkan dengan Audio

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.

Arsitektur Haptic Generator

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.

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

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

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

  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. Setelan defaultnya adalah 300 Hz. Hal ini dapat diubah dalam kode di sini.

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

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