Fondasi UX untuk kerangka haptik

Semua penyempurnaan framework Android yang dibangun berdasarkan haptics didorong oleh serangkaian prinsip UX yang berkembang dengan kecepatan yang sama. Prinsip-prinsip saat ini melibatkan penggantian getaran buzzy dengan haptik yang jelas , dan mengeksplorasi haptik yang kaya .

Prinsip UX

Gambar 1. Prinsip-prinsip saat ini

Tabel berikut mencantumkan semua API haptics yang tersedia.

API Metode Tahun ditambahkan
android.view.HapticFeedbackConstants
  • KONTEKS_KLIK
  • JAM_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • PANJANG_PRESS
Sebelum tahun 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • MENGONFIRMASI
  • MENOLAK
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.Lihat
  • melakukanHapticUmpan Balik()
Sebelum tahun 2016
android.os.Vibrator
  • bergetar()
  • memilikiVibrator()
Sebelum tahun 2016
  • memilikiAmplitudoKontrol()
2017 (Android 8)
  • areAllEffectsDidukung()
  • areAllPrimitivesDidukung()
  • areEffects Didukung()
  • adalahPrimitivesDidukung()
2020 (Android 11)
android.os.VibrationEffect
  • buatOneShot()
  • buat Bentuk Gelombang()
2017 (Android 8)
  • EFEK_TICK
  • EFFECT_KLIK
  • EFFECT_HEAVY_KLIK
  • EFFECT_DOUBLE_KLIK
  • buat yang sudah ditentukan sebelumnya ()
2019 (Android 10)
android.os.VibrationEffect.Komposisi
  • PRIMITIVE_TICK
  • PRIMITIVE_KLIK
  • tambahkanPrimitif()
  • menyusun()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

Getaran yang mencengangkan

Sejak zaman pager dan feature phone, 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 dapat membahayakan UX haptik dengan memberikan tayangan berkualitas rendah (misalnya, ponsel murah dan rusak).

Hapus haptik

Haptik yang jelas mendukung sensasi perubahan keadaan diskrit (misalnya, perubahan biner selama proses menghidupkan/mematikan). Karena sifat keterjangkauan diskrit , haptik yang jelas dihasilkan sebagai satu kesatuan (misalnya, satu efek haptik per satu kejadian masukan).

Android bertujuan untuk menghadirkan haptik yang jernih dengan sensasi yang kuat namun tajam, bukan sensasi yang mendengung atau lembek.

Konstanta haptik standar yang dibuat untuk mendukung haptik yang jelas meliputi 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 penerapan haptik.

Tekan dan lepaskan

Gambar 3. Menekan dan melepaskan.

Haptik yang kaya

Haptik yang kaya adalah kategori haptik yang berkembang yang melampaui efek berbasis impuls tunggal. Android bertujuan untuk mendukung haptik yang kaya dengan komposisi dan penyesuaian yang tinggi dengan tingkat perincian yang baik. Kasus penggunaan berikut didukung di Android 11 atau lebih rendah.

Haptik Kaya

Gambar 4. Haptik yang kaya dengan tekstur geser

Menyeret dan Menggesek

Gambar 5. Menyeret dan menggeser

Kasus penggunaan 1: Tekstur geser

Jika efek haptik diulangi saat jari meluncur di atas permukaan sentuh (misalnya, menyeret, menggesek, menjelajahi permukaan dengan tekstur haptik bayangan), efek haptik yang berulang sebaiknya tajam dan halus.

Jika efek individualnya lebih menarik daripada tajam, maka interval antar pengulangan kemungkinan besar akan terhapus. Hasilnya adalah satu dengungan panjang, bukan beberapa sinyal terpisah.

Jika amplitudonya tidak cukup halus, maka energi haptik yang dirasakan akan terakumulasi melalui pengulangan, sehingga menghasilkan haptik yang sangat kuat di akhir pengulangan.

Terapkan tekstur haptik permukaan sederhana untuk gerakan menggesek dan menyeret

Gunakan CLOCK_TICK dan TEXT_HANDLE_MOVE di HapticFeedbackConstants . Konstanta ini menentukan karakteristik pengulangan dan amplitudo.

Ciptakan efek Anda sendiri

Untuk membuat efek Anda sendiri, buatlah desain dengan merangkai rangkaian 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 dari Antarmuka HAL Vibrator .

Kasus penggunaan 2: Getaran panjang dengan efek yang mudah digunakan

Getaran panjang adalah getaran amplitudo halus yang bertransisi dari 0 ke amplitudo target. Getaran yang panjang dapat menghasilkan haptik perhatian yang mudah dipahami. Namun, getaran panjang yang tiba-tiba dapat mengagetkan pengguna di lingkungan yang sunyi, dan sering kali menimbulkan suara mendengung. Untuk menghasilkan getaran panjang yang lebih menyenangkan, terapkan efek ease-in di awal getaran panjang. Ini menghasilkan transisi amplitudo mulus yang menuju amplitudo target.

Terapkan 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 kemudahan, seperti yang ditunjukkan pada Gambar 6.

Getaran Panjang

Gambar 6. Kurva kemudahan masuk getaran yang 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 yang panjang. Sensasi haptik yang kuat namun singkat dari haptik yang jelas menghasilkan pola ritme yang berbeda. Jika dikombinasikan dengan rangsangan tingkat tinggi yang diberikan oleh getaran panjang, hal ini berhasil menarik perhatian pengguna.

Penting untuk mempertimbangkan pola ritme sensasi. Jika tidak ada ritme, pengguna menganggap sensasi haptik sebagai dengungan acak, dan cenderung mengabaikannya.

Pasangan Audio

Gambar 7. Contoh haptik pasangan audio

Haptik yang digabungkan dengan audio: Kiat untuk menerapkan

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

  • Gunakan kelas MediaPlayer atau SoundPool .

    • Aset dalam format OGG dengan kunci metadata khusus ( ANDROID_HAPTIC diikuti sejumlah saluran haptik) menunjukkan keberadaan data haptik 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 haptik, ingatlah bahwa saluran haptik 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) 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 yang sinkron.
  • Vibrator HAL harus menerapkan dukungan kontrol eksternal.

Haptik Gabungan Audio

Gambar 8. Menerapkan haptics yang digabungkan dengan audio

Haptik yang digabungkan dengan audio: Generator Haptik

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

Haptic Generator architecture

Gambar 9. Arsitektur Haptic Generator

Untuk memastikan algoritme generator haptik Anda menghasilkan haptik berkualitas tinggi, sesuaikan algoritme pembangkitan ke motor vibrator perangkat dengan menyesuaikan parameter yang mengonfigurasi rangkaian filter yang diterapkan pada 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 haptik memiliki keluaran maksimum. Parameter ini menyesuaikan anti-resonator untuk meratakan sebagian fungsi transfer respons, guna mendapatkan bandwidth yang lebih luas. Framework Android secara otomatis menautkan nilai ini ke output metode HAL HAL IVibrator.getResonantFrequency .

    Nilai default untuk parameter ini adalah 150Hz . Ini dapat dimodifikasi dalam 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 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 angka nol pada filter band-stop yang menghilangkan sebagian resonansi.

    • Kutub Q, faktor kualitas kutub pada 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 Nol Q dan 4 untuk Kutub Q menghasilkan rasio 2 , yang membatasi penekanan resonansi sebesar faktor 2 (6 dB). Kerangka kerja Android menghubungkan kedua nilai ke keluaran metode HAL HAL IVibrator.getQFactor .

    Jika nilai default tidak memperhitungkan pengurangan kekuatan motor pada perangkat Anda, sebaiknya ubah kedua nilai secara bersamaan, lalu tingkatkan keduanya atau kurangi 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. Standarnya adalah 300Hz . Ini dapat dimodifikasi dalam kode di sini .

  5. Penguatan input dan ambang batas kubus untuk distorsi

    Parameter ini digunakan oleh filter distorsi nonlinier yang diterapkan pada bentuk gelombang masukan yang meredam amplitudo sinyal frekuensi rendah dan meningkatkan amplitudo sinyal frekuensi tinggi.

    • Nilai default untuk faktor penguatan masukan 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 keluaran, sebaiknya buat plot respons frekuensi filter dan amati bagaimana respons frekuensi berubah dengan nilai parameter yang berbeda.

  6. Penguatan keluaran untuk distorsi

    Parameter ini mengontrol amplitudo getaran akhir. Ini adalah penguatan akhir 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, naikkan nilainya. Jika Anda dapat mendengar suara perangkat keras aktuator, turunkan nilainya.