Android cihazlardaki 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 kısa 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 cildinin 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, nitelik 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 hızlı tepki veren ve net bir titreşim sağlar.
Titreşim motoru çıkış hızlandırması
Frekans-çıkış-ivme eşlemesi (FOAM), belirli bir titreşim frekansında (Hertz cinsinden) elde edilebilecek maksimum çıkış ivmesini (G cinsinden) açıklar. 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ına yakındır. Sıklık bu aralıktan uzaklaştıkça ivme genellikle üstel olarak azalır. Eğri simetrik olmayabilir ve motoru hasardan korumak için rezonans frekansı civarında bir plato içerebilir.
Yandaki grafikte, LRA motoru için bir FOAM örneği gösterilmektedir.
İ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 dokunma algısı 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 otomatik olarak BasicEnvelopeBuilder içinde 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.
Bir online 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 hızlanma seviyeleri
Titreşim yoğunluğunun insan algısı, bir algı ölçüsü olarak, titreşim genliğiyle (fiziksel bir parametre) 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 şekilde hesaplanabilir:
...burada genlik dB, belirli bir frekansta SL ve algılama eşiğinin toplamıdır (bitişik grafikteki dikey eksen boyunca değer).
Yandaki grafik, titreşim ivmesi seviyelerini 10, 20, 30, 40 ve 50 dB SL'de, zamansal frekansın bir fonksiyonu olarak insan dokunsal algılaması eşiğiyle (0 dB SL) birlikte gösterir. Veriler, Verrillo, R. tarafından yayınlanan "Figure 8" adlı makaleden tahmin edilmiştir. T. ve diğerlerinin 1969 tarihli makalesi, "Sensation magnitude of vibrotactile stimuli.".
Android, bu dönüşümü otomatik olarak BasicEnvelopeBuilder içinde işler. Bu işlev, değerleri duyum düzeyi 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 bunun yerine değerleri ivme alanında (Gs) normalleştirilmiş çıkış ivme genlikleri olarak alır. Zarf API'si, bir tasarımcı veya geliştirici titreşim gücündeki değişiklikleri düşündüğünde algılanan harcanan efor düzeyinin parçalı doğrusal bir zarfı 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 da 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 biçimi 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 // Do not 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; // Do not 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.
Önceden tanımlanmış bu dokunsal sabitler ve temel öğeler, yüksek kaliteli dokunsal efektler oluştururken işinizi büyük ölçüde hızlandırabilir.