Koleksiyonlar ile düzeninizi koruyun
İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.
Android cihazlarda en yaygın titreşim aktüatörleri doğrusal rezonanslı aktüatörlerdir (LRA'lar). LRA'lar, normalde yanıt vermeyen cam yüzeylerde düğme tıklama hissini simüle eder. Net ve net bir tıklama geri bildirimi sinyali genellikle 10 ila 20 milisaniye sürer. Bu his, kullanıcı etkileşimlerinin daha doğal olmasını sağlar. Sanal klavyelerde bu tıklama geri bildirimi, yazma hızını artırabilir ve hataları azaltabilir.
Bazı LRA'ların rezonans frekansları 200 ila 300 Hz aralığındaydı. Bu frekans, insan derisinin titreşime en duyarlı olduğu frekansla aynıdır. Bu frekans aralığındaki titreşim hissi genellikle düzgün, keskin ve nüfuz edici olarak tanımlanır.
Diğer LRA modellerinin rezonans frekansları yaklaşık 150 Hz'dir. Bu modellerin verdiği his, nitelik açısından daha yumuşak ve daha dolgundur (boyut olarak).
Doğrusal rezonanslı aktüatör (LRA) bileşenleri.
İki farklı frekansta aynı giriş voltajı verildiğinde titreşim çıkış genlikleri farklı olabilir. Frekans, LRA'nın rezonans frekansından ne kadar uzaksa titreşim genliği o kadar düşük olur.
Belirli bir cihazın dokunma etkileri hem titreşim aktüatörünü hem de sürücüsünü kullanır.
Aşırı hız ve aktif frenleme özellikleri içeren dokunma duyarlı sürücüler, LRA'ların yükselme süresini ve zil sesini azaltarak daha duyarlı ve net bir titreşim sağlar.
Titreşimli motor çıkışı hızlandırması
Sıklıktan çıkış hızına eşleme (FOAM), belirli bir titreşim sıklığında (Hertz cinsinden) elde edilebilecek maksimum çıkış hızını (G tepesinde) tanımlar. Android 16'dan (API düzeyi 36) itibaren platform, VibratorFrequencyProfile aracılığıyla bu eşleme için yerleşik destek sunar. Dokunsal efektler oluşturmak için bu sınıfı temel ve gelişmiş zarf API'leriyle birlikte kullanabilirsiniz.
Çoğu LRA motorunun FOAM'ında, genellikle rezonans frekanslarının yakınında tek bir tepe noktası bulunur. Sıklık bu aralığın dışına çıktıkça hız genellikle katlanarak azalır. Eğri simetrik olmayabilir ve motoru hasara karşı korumak için rezonans frekansı etrafında bir plato içerebilir.
Bitişik grafikte, LRA motor için örnek bir FOAM gösterilmektedir.
LRA motor için örnek FOAM.
İnsan algısı algılama eşiği
İnsan algılama algılama eşiği, bir kişinin güvenilir bir şekilde algılayabileceği minimum titreşim ivmesini ifade eder. Bu seviye, titreşim sıklığına göre değişir.
Bitişik grafikte, zamansal frekansın bir işlevi olarak insan dokunma algısı algılama eşiği (ivmelenme cinsinden) gösterilmektedir. Eşik verileri, Bolanowski Jr., S. J., et
al.'ın 1988 tarihli makalesi,
"Dört kanal, dokunmanın mekanik yönlerini aracılık eder.".
Android, BasicEnvelopeBuilder içinde bu eşiği otomatik olarak yönetir. Bu işlem, tüm efektlerin insan algılama eşik değerini en az 10 dB aşan titreşim genlikleri üreten bir frekans aralığı kullandığını doğrular.
Titreşim yoğunluğuyla ilgili insan algısı, bir algı ölçüsü olarak, fiziksel bir parametre olan titreşim genliğiyle doğrusal olarak artmaz. Algılanan yoğunluk, aynı frekansta algılama eşiğinin üzerindeki dB miktarı olarak tanımlanan duyum düzeyi (SL) ile karakterize edilir.
Karşılık gelen titreşim ivmesi genliği (G tepesinde) aşağıdaki şekilde hesaplanabilir:
$$
Amplitude(G) = 10^{Amplitude(db)/20}
$$
Burada, genlik dB, belirli bir frekansta SL ve algılama eşiğinin (bitişik grafikteki dikey eksen boyunca değer) toplamıdır.
Bitişik grafikte, zamansal frekansın bir işlevi olarak 10, 20, 30, 40 ve 50 dB SL'deki titreşim ivme seviyeleri ile insan dokunma algısı algılama eşiği (0 dB SL) gösterilmektedir. Veriler, Verrillo, R. T. ve arkadaşlarının 1969 tarihli "Sensation magnitude of vibrotactile stimuli." (Titreşimli dokunma uyaranlarının duyusal büyüklüğü) makalesine bakabilirsiniz.
Titreşim hızlandırma seviyeleri.
Android, bu dönüşümü BasicEnvelopeBuilder içinde otomatik olarak gerçekleştirir. BasicEnvelopeBuilder, değerleri duyum düzeyi alanında (dB SL) normalleştirilmiş yoğunluklar olarak alır ve çıkış ivmesine dönüştürür. Öte yandan WaveformEnvelopeBuilder, bu dönüşümü uygulamaz ve değerleri hız alanındaki normalleştirilmiş çıkış hız amplitüdü olarak (Gs) alır. Zarf API'si, bir tasarımcı veya geliştiricinin titreşim gücündeki değişiklikleri düşündüğünde, algılanan yoğunluğun parçalara ayrılmış doğrusal bir zarfı takip etmesini beklediğini varsayar.
Cihazlarda varsayılan dalga sönümleme
Özel bir dalga biçimi deseninin genel bir cihazda nasıl davrandığını açıklamak için aşağıdakileri göz önünde bulundurun:
Aşağıdaki grafiklerde, önceki kod snippet'lerine karşılık gelen giriş dalga biçimi ve çıkış ivmesi gösterilmektedir. Desende genlikte ani bir değişiklik olduğunda (yani 0 ms, 150 ms, 200 ms, 250 ms ve 700 ms'de) ivmenin aniden değil, kademeli olarak arttığını unutmayın. Ayrıca, her bir adım amplitüdü değişikliğinde aşırı aşma vardır ve giriş amplitüdü aniden 0'a düştüğünde en az 50 ms süren görünür bir zil sesi vardır.
Adım işlevi giriş dalga biçiminin grafiği.
Seviyeler arasında daha organik geçişler gösteren, gerçek ölçülen dalga biçiminin grafiği.
İyileştirilmiş dokunma deseni
Aşırı aşmayı önlemek ve zil çalmasını azaltmak için genlikleri daha kademeli olarak değiştirin. Aşağıda, düzeltilen sürümün dalga biçimi ve hızlandırma çizelgeleri gösterilmektedir:
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));
Ek adımlar içeren giriş dalga biçiminin grafiği.
Daha yumuşak geçişleri gösteren, ölçülen dalga formunun grafiği.
Daha karmaşık dokunma efektleri oluşturma
Tatmin edici bir tıklama yanıtındaki diğer öğeler daha karmaşıktır ve cihazda kullanılan LRA hakkında bilgi sahibi olmayı gerektirir. En iyi sonuçlar için cihazın önceden oluşturulmuş dalga formlarını ve platform tarafından sağlanan sabitleri kullanın. Bu sayede şunları yapabilirsiniz:
Yeni dokunma etkileri oluşturmak için bunları birleştirin.
Bu önceden tanımlanmış dokunma sabitleri ve primitifleri, yüksek kaliteli dokunma efektleri oluştururken işinizi büyük ölçüde hızlandırabilir.
Bu sayfadaki içerik ve kod örnekleri, İçerik Lisansı sayfasında açıklanan lisanslara tabidir. Java ve OpenJDK, Oracle ve/veya satış ortaklarının tescilli ticari markasıdır.
Son güncelleme tarihi: 2025-07-27 UTC.
[[["Anlaması kolay","easyToUnderstand","thumb-up"],["Sorunumu çözdü","solvedMyProblem","thumb-up"],["Diğer","otherUp","thumb-up"]],[["İhtiyacım olan bilgiler yok","missingTheInformationINeed","thumb-down"],["Çok karmaşık / çok fazla adım var","tooComplicatedTooManySteps","thumb-down"],["Güncel değil","outOfDate","thumb-down"],["Çeviri sorunu","translationIssue","thumb-down"],["Örnek veya kod sorunu","samplesCodeIssue","thumb-down"],["Diğer","otherDown","thumb-down"]],["Son güncelleme tarihi: 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."]]