Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Aktuator getaran yang paling umum di perangkat Android adalah aktuator resonan linear (LRA). LRA menyimulasikan perasaan klik tombol
pada permukaan kaca yang tidak responsif. Sinyal masukan klik yang jelas dan tajam
biasanya berlangsung antara 10 dan 20 milidetik. Sensasi
ini membuat interaksi pengguna terasa lebih alami. Untuk keyboard virtual, masukan klik ini dapat meningkatkan kecepatan mengetik dan mengurangi error.
Beberapa LRA memiliki frekuensi resonansi dalam rentang 200 hingga 300 Hz, yang
bersamaan dengan frekuensi saat kulit manusia paling sensitif terhadap
getaran. Sensasi getaran pada rentang frekuensi ini biasanya
digambarkan sebagai halus, tajam, dan menembus.
Model LRA lainnya memiliki frekuensi resonansi yang lebih rendah, sekitar 150 Hz. Sensasi
secara kualitatif lebih lembut dan lebih penuh (dalam dimensi).
Komponen aktuator resonansi linear (LRA).
Dengan tegangan input yang sama pada dua frekuensi yang berbeda, amplitudo output
getaran dapat berbeda. Makin jauh frekuensi dari frekuensi resonansi
LRA, makin rendah amplitudo getarnya.
Efek haptic perangkat tertentu menggunakan aktuator getaran dan driver-nya.
Driver haptic yang menyertakan fitur overdrive dan pengereman aktif dapat mengurangi
waktu naik dan dering LRA, sehingga menghasilkan getaran yang lebih responsif dan jelas.
Akselerasi output vibrator
Pemetaan frekuensi ke akselerasi output (FOAM) menjelaskan akselerasi output maksimum
yang dapat dicapai (dalam puncak G) pada frekuensi getaran tertentu (dalam
Hertz). Mulai Android 16 (API level 36), platform ini menyediakan dukungan bawaan
untuk pemetaan ini melalui VibratorFrequencyProfile. Anda dapat menggunakan
class ini, bersama dengan API amplop dasar dan lanjutan, untuk membuat
efek haptik.
Sebagian besar motor LRA memiliki satu puncak dalam FOAM, biasanya di dekat frekuensi
resonansinya. Akselerasi umumnya menurun secara eksponensial saat frekuensi menyimpang
dari rentang ini. Kurva mungkin tidak simetris dan mungkin memiliki dataran tinggi
di sekitar frekuensi resonansi untuk melindungi motor dari kerusakan.
Plot yang berdekatan menunjukkan contoh FOAM untuk motor LRA.
Contoh FOAM untuk motor LRA.
Batas deteksi persepsi manusia
Batas deteksi persepsi manusia mengacu pada akselerasi minimum
getaran yang dapat dideteksi dengan andal oleh seseorang. Tingkat ini bervariasi berdasarkan
frekuensi getaran.
Plot yang berdekatan menunjukkan nilai minimum deteksi persepsi haptic manusia, dalam
akselerasi, sebagai fungsi frekuensi temporal. Data nilai minimum
dikonversi dari nilai minimum perpindahan pada Gambar 1 Bolanowski Jr., S. J., et
al. tahun 1988,
"Empat saluran memediasi aspek mekanis sentuhan"..
Android secara otomatis menangani nilai minimum ini di BasicEnvelopeBuilder,
yang memverifikasi bahwa semua efek menggunakan rentang frekuensi yang menghasilkan amplitudo
getaran yang melebihi nilai minimum deteksi persepsi manusia sebesar setidaknya
10 dB.
Persepsi manusia tentang intensitas getaran, yaitu pengukuran persepsi, tidak tumbuh
secara linear dengan amplitudo getaran, yaitu parameter fisik. Intensitas yang dirasakan
ditandai oleh tingkat sensasi (SL), yang didefinisikan sebagai jumlah dB di atas
nilai minimum deteksi pada frekuensi yang sama.
Amplitudo akselerasi getaran yang sesuai (dalam puncak G) dapat dihitung
sebagai berikut:
$$
Amplitude(G) = 10^{Amplitude(db)/20}
$$
...dengan dB amplitudo adalah jumlah SL dan nilai minimum deteksi—nilai
di sepanjang sumbu vertikal dalam plot yang berdekatan—pada frekuensi tertentu.
Plot yang berdekatan menunjukkan tingkat akselerasi getaran pada 10, 20, 30, 40, dan
50 dB SL, beserta nilai minimum deteksi persepsi haptic manusia (0 dB SL),
sebagai fungsi frekuensi temporal. Data ini diperkirakan dari Gambar 8 dalam
Verrillo, R. T., et al. tahun 1969, "Sensation magnitude of vibrotactile
stimuli.".
Tingkat akselerasi getaran.
Android otomatis menangani konversi ini di BasicEnvelopeBuilder,
yang mengambil nilai sebagai intensitas ternormalisasi di ruang level sensasi (dB
SL) dan mengonversinya menjadi akselerasi output. Di sisi lain,
WaveformEnvelopeBuilder tidak menerapkan konversi ini dan mengambil nilai sebagai amplitudo
akselerasi output yang dinormalisasi dalam ruang akselerasi (Gs). Envelope API mengasumsikan bahwa, saat desainer atau developer memikirkan perubahan kekuatan getaran, mereka mengharapkan intensitas yang dirasakan mengikuti envelope linear piecewise.
Penghalusan bentuk gelombang default di perangkat
Sebagai ilustrasi, pertimbangkan bagaimana pola bentuk gelombang kustom berperilaku di perangkat
generik:
Plot berikut menunjukkan bentuk gelombang input dan akselerasi output
yang sesuai dengan cuplikan kode sebelumnya. Perhatikan bahwa akselerasi
bertambah secara bertahap, bukan tiba-tiba, setiap kali ada perubahan langkah amplitudo
dalam pola—yaitu, pada 0 mdtk, 150 mdtk, 200 mdtk, 250 mdtk, dan 700 mdtk. Ada juga
overshoot pada setiap perubahan langkah amplitudo, dan ada derau yang terlihat yang
berlangsung setidaknya 50 md saat amplitudo input tiba-tiba turun ke 0.
Plot bentuk gelombang input fungsi langkah.
Plot bentuk gelombang yang diukur sebenarnya, yang menunjukkan transisi yang lebih organik
di antara level.
Pola haptic yang ditingkatkan
Untuk menghindari overshoot dan mengurangi waktu dering, ubah amplitudo secara
lebih bertahap. Berikut ini menunjukkan plot gelombang dan akselerasi dari
versi yang direvisi:
Kotlin
valtimings:LongArray=longArrayOf(25,25,50,25,25,25,25,25,25,25,75,25,25,300,25,25,150,25,25,25)valamplitudes:IntArray=intArrayOf(38,77,79,84,92,99,121,143,180,217,255,170,85,0,85,170,255,170,85,0)valrepeatIndex=-1// Do not repeat.vibrator.vibrate(VibrationEffect.createWaveform(timings,amplitudes,repeatIndex))
Java
long[]timings=newlong[]{25,25,50,25,25,25,25,25,25,25,75,25,25,300,25,25,150,25,25,25};int[]amplitudes=newint[]{38,77,79,84,92,99,121,143,180,217,255,170,85,0,85,170,255,170,85,0};intrepeatIndex=-1;// Do not repeat.vibrator.vibrate(VibrationEffect.createWaveform(timings,amplitudes,repeatIndex));
Plot bentuk gelombang input dengan langkah tambahan.
Plot bentuk gelombang yang diukur, yang menunjukkan transisi yang lebih halus.
Membuat efek haptic yang lebih kompleks
Elemen lain dalam respons klik yang memuaskan lebih rumit, sehingga memerlukan beberapa
pengetahuan tentang LRA yang digunakan di perangkat. Untuk hasil terbaik, gunakan bentuk gelombang
prafabrikasi perangkat dan konstanta yang disediakan platform, yang memungkinkan Anda melakukan
hal berikut:
Gabungkan keduanya untuk membuat efek haptik baru.
Konstanta dan primitif haptik yang telah ditentukan ini dapat sangat mempercepat pekerjaan Anda
saat membuat efek haptik berkualitas tinggi.
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-07-27 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-07-27 UTC."],[],[],null,["# Analyze vibration waveforms\n\nThe most common vibration actuators on Android devices are [linear resonant\nactuators (LRAs)](https://medium.com/@SomaticLabs/what-is-a-linear-resonant-actuator-81cc25f85779). LRAs simulate the feeling of a button click\non what is otherwise an unresponsive glass surface. A clear and crisp click\nfeedback signal typically lasts between 10 and 20 milliseconds in duration. This\nsensation makes user interactions feel more natural. For virtual keyboards, this\nclick feedback can increase typing speed and reduce errors.\n\nLRAs have a few common [resonant frequencies](https://en.wikipedia.org/wiki/Resonance#Examples):\n\n- Some LRAs had resonant frequencies in the 200 to 300 Hz range, which coincides with the frequency at which human skin is most sensitive to vibration. The sensation of vibrations at this frequency range are usually described as smooth, sharp, and penetrating.\n- Other models of LRAs have lower resonance frequencies, at around 150 Hz. The sensation is qualitatively softer and fuller (in dimension). \nComponents of a linear resonant actuator (LRA).\n\n\u003cbr /\u003e\n\nGiven the same input voltage at two different frequencies, the vibration output\namplitudes can be different. The further away the frequency is from the LRA's\nresonant frequency, the lower its vibration amplitude.\n\nA given device's haptic effects use both the vibration actuator and its driver.\nHaptic drivers that include overdrive and active braking features can reduce the\nrise time and ringing of LRAs, leading to a more responsive and clear vibration.\n\nVibrator output acceleration\n----------------------------\n\n\nThe frequency-to-output-acceleration mapping (FOAM) describes the maximum\nachievable output acceleration (in G peak) at a given vibration frequency (in\nHertz). Starting in Android 16 (API level 36), the platform provides built-in\nsupport for this mapping through the `VibratorFrequencyProfile`. You can use\nthis class, along with the [basic](/reference/android/os/VibrationEffect.BasicEnvelopeBuilder) and [advanced](/reference/android/os/VibrationEffect.WaveformEnvelopeBuilder) envelope APIs, to create\nhaptic effects.\n\nMost LRA motors have a single peak in their FOAM, typically near their resonant\nfrequency. Acceleration generally decreases exponentially as frequency deviates\nfrom this range. The curve may not be symmetrical and might feature a plateau\naround the resonant frequency to protect the motor from damage.\n\nThe adjacent plot shows an example FOAM for an LRA motor. \nExample FOAM for an LRA motor.\n\n\u003cbr /\u003e\n\n### Human perception detection threshold\n\n\nThe *human perception detection threshold* refers to the minimum acceleration of\na vibration that a person can reliably detect. This level varies based on the\nvibration frequency.\n\nThe adjacent plot shows the human haptic perception detection threshold, in\nacceleration, as a function of temporal frequency. The threshold data is\nconverted from displacement threshold in Figure 1 of Bolanowski Jr., S. J., et\nal.'s 1988 article,\n[\"Four channels mediate the mechanical aspects of touch.\"](https://pubmed.ncbi.nlm.nih.gov/3209773/).\n\nAndroid automatically handles this threshold in the `BasicEnvelopeBuilder`,\nwhich verifies that all effects use a frequency range that prodcues vibration\namplitudes that exceed the human perception detection threshold by at least\n10 dB. \nHuman haptic perception detection threshold.\n\n\u003cbr /\u003e\n\nAn online tutorial further explains the [conversion between acceleration\namplitude and displacement amplitude](https://www.tangerinex.com/tutorial-1).\n\n### Vibration acceleration levels\n\n\nHuman perception of vibration intensity, a *perception* measure, doesn't grow\nlinearly with vibration amplitude, a *physical* parameter. Perceived intensity\nis characterized by sensation level (SL), which is defined as a dB amount above\nthe detection threshold at the same frequency.\n\nThe corresponding vibration acceleration amplitude (in G peak) can be calculated\nas follows: \n$$ Amplitude(G) = 10\\^{Amplitude(db)/20} $$\n\n...where the amplitude dB is the sum of SL and detection threshold---the value\nalong the vertical axis in the adjacent plot---at a particular frequency.\n\nThe adjacent plot shows the vibration acceleration levels at 10, 20, 30, 40 and\n50 dB SL, along with the human haptic perception detection threshold (0 dB SL),\nas a function of temporal frequency. The data is estimated from Figure 8 in\nVerrillo, R. T., et al.'s 1969 article, [\"Sensation magnitude of vibrotactile\nstimuli.\"](https://link.springer.com/article/10.3758/BF03212793). \nVibration acceleration levels.\n\n\u003cbr /\u003e\n\nAndroid automatically handles this conversion in the `BasicEnvelopeBuilder`,\nwhich takes values as normalized intensities in the sensation level space (dB\nSL) and converts them to output acceleration. The `WaveformEnvelopeBuilder`, on\nthe other hand, doesn't apply this conversion and takes values as normalized\noutput acceleration amplitudes in the acceleration space (Gs) instead. The\nenvelope API assumes that, when a designer or developer thinks about changes in\nvibration strength, they expect the perceived intensity to follow a piecewise\nlinear envelope.\n\nDefault waveform smoothing on devices\n-------------------------------------\n\nFor illustration, consider how a custom waveform pattern behaves on a generic\ndevice: \n\n### Kotlin\n\n val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)\n val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)\n val repeatIndex = -1 // Don't repeat.\n\n vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))\n\n### Java\n\n long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };\n int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };\n int repeatIndex = -1 // Don't repeat.\n\n vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));\n\nThe following plots show the input waveform and output acceleration\ncorresponding to the preceding code snippets. Note that the acceleration\nincreases gradually, not suddenly, whenever there is a step change of amplitude\nin the pattern---that is, at 0ms, 150ms, 200ms, 250ms, and 700ms. There is also an\novershoot at each step change of amplitude, and there is visible ringing that\nlasts at least 50ms when the input amplitude suddenly drops to 0.\n\n\nPlot of step function input waveform. \nPlot of actual measured waveform, showing more organic transitions between levels.\n\n\u003cbr /\u003e\n\nImproved haptic pattern\n-----------------------\n\nTo avoid overshoot and reduce ringing time, change the amplitudes more\ngradually. The following shows the waveform and acceleration plots of the\nrevised version: \n\n### Kotlin\n\n val timings: LongArray = longArrayOf(\n 25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,\n 300, 25, 25, 150, 25, 25, 25\n )\n val amplitudes: IntArray = intArrayOf(\n 38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,\n 0, 85, 170, 255, 170, 85, 0\n )\n val repeatIndex = -1 // Do not repeat.\n\n vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))\n\n### Java\n\n long[] timings = new long[] {\n 25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,\n 300, 25, 25, 150, 25, 25, 25\n };\n int[] amplitudes = new int[] {\n 38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,\n 0, 85, 170, 255, 170, 85, 0\n };\n int repeatIndex = -1; // Do not repeat.\n\n vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));\n\n\nPlot of input waveform with additional steps. \nPlot of measured waveform, showing smoother transitions.\n\n\u003cbr /\u003e\n\nCreate more complex haptic effects\n----------------------------------\n\nOther elements in a satisfying click response are more intricate, requiring some\nknowledge of the LRA used in a device. For best results, use the device's\npre-fabricated waveforms and platform-provided constants, which let you do the\nfollowing:\n\n- Perform clear effects and [primitives](/develop/ui/views/haptics/custom-haptic-effects#primitives).\n- Concatenate them to compose new haptic effects.\n\nThese predefined haptic constants and primitives can greatly speed up your work\nwhile creating high-quality haptic effects."]]