Bu belgede, Android cihazlardaki yaygın titreşim aktüatörleri olarak Doğrusal Rezonanslı Aktüatörler (LRA'lar) açıklanmakta, özellikleri, dokunsal geri bildirim oluşturma şekilleri ve Android API'lerini kullanarak etkili dokunsal desenler oluşturma yöntemleri ayrıntılı olarak anlatılmaktadır. keywords_public: > Android haptics, haptic actuators, Linear Resonant Actuators, LRAs, vibration, haptic feedback, VibratorFrequencyProfile, VibrationEffect, Android UI
Android cihazlarda en yaygın titreşim aktüatörleri doğrusal rezonanslı aktüatörlerdir (LRA). LRAs, aksi takdirde yanıt vermeyen bir cam yüzeyde düğme tıklama hissini simüle eder. Net ve belirgin 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.
LRAs'nın birkaç yaygın rezonans frekansı vardır:
- Bazı LRAs'ların rezonans frekansları 200-300 Hz aralığındadır. Bu aralık, insan derisinin titreşime en duyarlı olduğu frekansla çakışır. Bu frekans aralığındaki titreşim hissi genellikle yumuşak, keskin ve nüfuz edici olarak tanımlanır.
- Diğer LRA modellerinin rezonans frekansları daha düşüktür (yaklaşık 150 Hz). Bu modellerde his, niteliksel olarak daha yumuşak ve daha dolgundur (boyut olarak).
İki farklı frekansta aynı giriş voltajı verildiğinde titreşim çıkış genlikleri farklı olabilir. Frekans, LRA'nın rezonans frekansından ne kadar uzak olursa titreşim genliği o kadar düşük olur.
Belirli bir cihazın dokunsal efektleri hem titreşim aktüatörünü hem de sürücüsünü kullanır. Overdrive ve aktif frenleme özelliklerini içeren dokunsal sürücüler, LRA'ların yükselme süresini ve çınlamasını azaltarak daha duyarlı ve net bir titreşim sağlar.
Titreşim motoru çıkış hızlanması
Frekans-çıkış-ivme eşlemesi (FOAM), belirli bir titreşim frekansında (Hertz cinsinden) elde edilebilecek maksimum çıkış ivmesini (G cinsinden) tanımlar. Android 16'dan (API düzeyi 36) itibaren platform, VibratorFrequencyProfile aracılığıyla bu eşlemeye yerleşik destek sunar. Dokunsal efektler oluşturmak için bu sınıfı basic ve advanced zarf API'leriyle birlikte kullanabilirsiniz.
Çoğu LRA motorunun FOAM'ında tek bir tepe noktası bulunur. Bu nokta genellikle rezonans frekansının yakınındadır. Hızlanma, frekans bu aralıktan uzaklaştıkça genellikle üstel olarak azalır. Eğri simetrik olmayabilir ve motoru hasardan korumak için rezonans frekansı civarında bir plato içerebilir.
Bitişik grafik, LRA motoru için bir FOAM örneğini gösterir.
İnsan algısı algılama eşiği
İnsan algısı algılama eşiği, bir kişinin güvenilir bir şekilde algılayabileceği titreşimin minimum ivmesini ifade eder. Bu seviye, titreşim frekansına göre değişir.
Yandaki grafik, zamansal frekansın bir fonksiyonu olarak, ivme cinsinden insanın dokunsal algı algılama eşiğini gösterir. Eşik verileri, Bolanowski Jr.'ın 1. Şekli'ndeki yer değiştirme eşiğinden dönüştürülür. S. J. ve diğerlerinin 1988 tarihli makalesi, "Four channels mediate the mechanical aspects of touch.".
Android, bu eşiği BasicEnvelopeBuilder içinde otomatik olarak işler. Bu, tüm efektlerin, titreşim genliklerini insan algısı algılama eşiğini en az 10 dB aşacak şekilde üreten bir frekans aralığı kullandığını doğrular.
Online bir eğitimde ivme genliği ile yer değiştirme genliği arasındaki dönüşüm daha ayrıntılı olarak açıklanmaktadır.
Titreşim ivmesi seviyeleri
Titreşim yoğunluğunun insan algısı (bir algı ölçüsü), titreşim genliği (bir fiziksel parametre) ile 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.
İlgili titreşim ivmesi genliği (G tepe değerinde) aşağıdaki gibi hesaplanabilir:
...burada genlik dB, belirli bir frekansta SL ve algılama eşiğinin toplamıdır. Bu değer, bitişik grafikteki dikey eksen boyunca yer alır.
Yandaki grafikte, titreşim ivmesi seviyeleri 10, 20, 30, 40 ve 50 dB SL'de, zamansal frekansın bir fonksiyonu olarak insan dokunsal algılamasının algılama eşiği (0 dB SL) ile birlikte gösterilmektedir. Veriler, Verrillo, R. adlı çalışmadaki Şekil 8'den tahmin edilmiştir. T. ve diğerlerinin 1969 tarihli makalesi, "Sensation magnitude of vibrotactile stimuli.".
Android, bu dönüştürme işlemini otomatik olarak BasicEnvelopeBuilder içinde gerçekleştirir. Bu işlem, değerleri duyum seviyesi alanında (dB SL) normalleştirilmiş yoğunluklar olarak alır ve çıkış ivmesine dönüştürür. Diğer yandan WaveformEnvelopeBuilder bu dönüşümü uygulamaz ve değerleri ivme alanında (Gs) normalleştirilmiş çıkış ivmesi genlikleri olarak alır. Envelope API, bir tasarımcı veya geliştirici titreşim gücündeki değişiklikleri düşündüğünde algılanan yoğunluğun parçalı doğrusal bir envelope'u takip etmesini beklediğini varsayar.
Cihazlarda varsayılan dalga biçimi düzeltme
Örnek olarak, özel bir dalga biçimi deseninin genel bir cihazda nasıl davrandığını ele alalım:
Kotlin
val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
Aşağıdaki grafiklerde, giriş dalga biçimi ve önceki kod snippet'lerine karşılık gelen çıkış ivmesi gösterilmektedir. Desende genlikte adım değişikliği olduğunda (yani 0 ms, 150 ms, 200 ms, 250 ms ve 700 ms'de) hızlanmanın aniden değil, kademeli olarak arttığını unutmayın. Ayrıca, genlikteki her adım değişikliğinde aşma ve giriş genliği aniden 0'a düştüğünde en az 50 ms süren görünür çınlama vardır.
İyileştirilmiş dokunsal desen
Aşmayı önlemek ve çınlama süresini azaltmak için genlikleri daha kademeli olarak değiştirin. Aşağıda, revize edilmiş sürümün dalga formu ve ivme grafikleri gösterilmektedir:
Kotlin
val timings: LongArray = longArrayOf(
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] {
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
};
int[] amplitudes = new int[] {
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
};
int repeatIndex = -1; // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
Daha karmaşık dokunsal efektler 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 üretilmiş dalga biçimlerini ve platform tarafından sağlanan sabitlerini kullanın. Bu sayede şunları yapabilirsiniz:
- Net efektler ve temel şekiller oluşturun.
- Yeni dokunsal efektler oluşturmak için bunları birleştirin.
Bu önceden tanımlanmış dokunsal sabitler ve temel öğeler, yüksek kaliteli dokunsal efektler oluştururken işinizi büyük ölçüde hızlandırabilir.