ตัวกระตุ้นการสั่นที่พบบ่อยที่สุดในอุปกรณ์ Android คือตัวกระตุ้นแบบเรโซแนนซ์เชิงเส้น (LRA) LRA จำลองความรู้สึกของการคลิกปุ่มบนพื้นผิวกระจกที่ไม่ตอบสนอง สัญญาณการคลิกที่ชัดเจนและคมชัดมักจะมีระยะเวลาระหว่าง 10 ถึง 20 มิลลิวินาที ความรู้สึกนี้ทำให้การโต้ตอบของผู้ใช้ดูเป็นธรรมชาติมากขึ้น สำหรับแป้นพิมพ์เสมือนจริง ฟีเจอร์นี้จะช่วยเพิ่มความเร็วในการพิมพ์และลดข้อผิดพลาด
LRA มีความถี่ในการสั่นทั่วไป 2-3 รายการดังนี้
- LRA บางตัวมีความถี่เรโซแนนซ์ในช่วง 200 ถึง 300 Hz ซึ่งตรงกับความถี่ที่ผิวหนังของมนุษย์ไวต่อการสั่นสะเทือนมากที่สุด ความรู้สึกของการสั่นในช่วงความถี่นี้มักจะอธิบายว่าราบรื่น คมชัด และเจาะลึก
- LRA รุ่นอื่นๆ มีค่าความถี่เรโซแนนซ์ต่ำกว่า โดยอยู่ที่ประมาณ 150 Hz เสียงที่ได้จะนุ่มนวลและเต็มกว่า (ในแง่ของมิติข้อมูล)
เมื่อใช้แรงดันไฟฟ้าอินพุตเดียวกันที่ความถี่ 2 ค่าที่แตกต่างกัน ระดับความแรงของสัญญาณเอาต์พุตการสั่นอาจแตกต่างกัน ยิ่งความถี่ห่างจากความถี่เรโซแนนซ์ของ LRA มากเท่าใด แอมพลิจูดการสั่นก็จะยิ่งต่ำลงเท่านั้น
เอฟเฟกต์การสัมผัสของอุปกรณ์หนึ่งๆ ใช้ทั้งตัวกระตุ้นการสั่นและไดรเวอร์ ตัวขับการสัมผัสที่มีฟีเจอร์โอเวอร์ไดรฟ์และการเบรกแบบแอ็กทีฟจะช่วยลดเวลาในการตอบสนองและการสั่นของ LRA ซึ่งทำให้การสั่นตอบสนองได้ดีขึ้นและชัดเจนยิ่งขึ้น
การเร่งความเร็วเอาต์พุตของไวเบรเตอร์
การแมปความถี่กับอัตราเร่งเอาต์พุต (FOAM) อธิบายอัตราเร่งเอาต์พุตสูงสุดที่ทำได้ (เป็น G สูงสุด) ที่ความถี่การสั่นสะเทือนหนึ่งๆ (เป็นเฮิร์ตซ์) ตั้งแต่ Android 16 (API ระดับ 36) เป็นต้นไป แพลตฟอร์มจะรองรับการแมปนี้ในตัวผ่าน VibratorFrequencyProfile
คุณสามารถใช้คลาสนี้ร่วมกับ API ของโฟลเดอร์พื้นฐานและขั้นสูงเพื่อสร้างเอฟเฟกต์การสัมผัสได้
มอเตอร์ LRA ส่วนใหญ่จะมีจุดสูงสุดเพียงจุดเดียวใน FOAM ซึ่งมักจะอยู่ใกล้กับความถี่เรโซแนนซ์ โดยทั่วไปแล้ว การเร่งจะลดลงแบบทวีคูณเมื่อความถี่เบี่ยงเบนออกจากช่วงนี้ เส้นโค้งอาจไม่สมมาตรและอาจมีการคงที่อยู่รอบความถี่เรโซแนนซ์เพื่อปกป้องมอเตอร์จากความเสียหาย
ผังข้างๆ แสดงตัวอย่าง FOAM สำหรับมอเตอร์ LRA
เกณฑ์การตรวจจับการรับรู้ของมนุษย์
เกณฑ์การตรวจจับการรับรู้ของมนุษย์หมายถึงความเร่งขั้นต่ำของการสั่นที่มนุษย์สามารถตรวจจับได้อย่างน่าเชื่อถือ ระดับนี้แตกต่างกันไปตามความถี่ของการสั่น
ผังข้างๆ แสดงเกณฑ์การตรวจจับการรับรู้สัมผัสของมนุษย์ในรูปแบบการเร่งความเร็ว เทียบกับความถี่ตามช่วงเวลา ข้อมูลเกณฑ์แปลงมาจากเกณฑ์การกระจัดในรูปที่ 1 ของ Bolanowski Jr., S. บทความของ J. และคณะในปี 1988 ที่ชื่อ"Four channels mediate the mechanical aspects of touch."
Android จะจัดการเกณฑ์นี้โดยอัตโนมัติใน BasicEnvelopeBuilder
ซึ่งจะยืนยันว่าเอฟเฟกต์ทั้งหมดใช้ช่วงความถี่ที่ทำให้เกิดแอมพลิจูดการสั่นสะเทือนที่มากกว่าเกณฑ์การตรวจจับการรับรู้ของมนุษย์อย่างน้อย 10 dB
บทแนะนำออนไลน์จะอธิบายเพิ่มเติมเกี่ยวกับการเปลี่ยนรูปแบบระหว่างความเร่ง และความกว้างของรูปคลื่น
ระดับการเร่งความเร็วของการสั่น
การรับรู้ความแรงของการสั่นของมนุษย์ ซึ่งเป็นการวัดการรับรู้ ไม่ได้เพิ่มขึ้นตามสัดส่วนกับแอมพลิจูดการสั่น ซึ่งเป็นพารามิเตอร์ทางกายภาพ ระดับความแรงที่รับรู้จะมีลักษณะเป็นระดับความรู้สึก (SL) ซึ่งหมายถึงจำนวน dB เหนือเกณฑ์การตรวจจับที่ความถี่เดียวกัน
คำนวณความกว้างของคลื่นความเร่งของแรงสั่นสะเทือนที่เกี่ยวข้อง (ใน G สูงสุด) ได้ดังนี้
...โดยที่ dB ของระดับแอมพลิจูดคือผลรวมของ SL และเกณฑ์การตรวจจับ ซึ่งเป็นค่าตามแนวแกนตั้งในผังที่อยู่ติดกัน ณ ความถี่หนึ่งๆ
ผังข้างแสดงระดับการเร่งความเร็วของแรงสั่นที่ 10, 20, 30, 40 และ 50 dB SL พร้อมกับเกณฑ์การตรวจจับการรับรู้สัมผัสของมนุษย์ (0 dB SL) ในฐานะฟังก์ชันของความถี่ตามช่วงเวลา ข้อมูลนี้เป็นค่าประมาณจากรูปที่ 8 ใน Verrillo, R. บทความของ T. และคณะในปี 1969 เรื่อง "Sensation magnitude of vibrotactile stimuli."
Android จะจัดการการเปลี่ยนรูปแบบนี้โดยอัตโนมัติใน BasicEnvelopeBuilder
ซึ่งจะใช้ค่าเป็นระดับความเข้มที่ปรับมาตรฐานแล้วในพื้นที่ระดับความรู้สึก (dB
SL) และแปลงเป็นอัตราเร่งเอาต์พุต ในทางกลับกัน WaveformEnvelopeBuilder
จะไม่ใช้การแปลงนี้และจะใช้ค่าเป็นแอมพลิจูดการเร่งความเร็วที่แปลงเป็นมาตรฐานในเชิงพื้นที่การเร่งความเร็ว (Gs) แทน Envelope API จะถือว่าเมื่อนักออกแบบหรือนักพัฒนาแอปคิดถึงการเปลี่ยนแปลงของระดับการสั่นสะเทือน บุคคลเหล่านั้นคาดหวังว่าความเข้มงวดที่รับรู้จะเป็นไปตามรูปคลื่นเชิงเส้นแบบแบ่งส่วน
การปรับรูปคลื่นเริ่มต้นในอุปกรณ์
ต่อไปนี้เป็นภาพประกอบลักษณะการทำงานของรูปแบบคลื่นที่กำหนดเองในอุปกรณ์ทั่วไป
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));
ผังต่อไปนี้แสดงรูปแบบคลื่นอินพุตและอัตราเร่งเอาต์พุตซึ่งสอดคล้องกับข้อมูลโค้ดก่อนหน้า โปรดทราบว่าความเร่งจะเพิ่มขึ้นอย่างช้าๆ ไม่ใช่ทันทีทุกครั้งที่มีการเปลี่ยนแปลงความกว้างของรูปแบบแบบขั้น เช่น ที่ 0 มิลลิวินาที, 150 มิลลิวินาที, 200 มิลลิวินาที, 250 มิลลิวินาที และ 700 มิลลิวินาที นอกจากนี้ ยังมีช่วงการเพิ่มขึ้นเกินที่ระดับความกว้างแต่ละขั้น และมีการรีแอ็กชันที่เห็นได้ชัดซึ่งนานอย่างน้อย 50 มิลลิวินาทีเมื่อระดับความกว้างของอินพุตลดลงเป็น 0 อย่างฉับพลัน
รูปแบบการสัมผัสที่ปรับปรุงใหม่
หากต้องการหลีกเลี่ยงการเกินและลดเวลาในการส่งเสียง ให้เปลี่ยนแอมพลิจูดอย่างค่อยเป็นค่อยไป ต่อไปนี้แสดงรูปแบบคลื่นและผังความเร่งของเวอร์ชันที่แก้ไขแล้ว
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));
สร้างเอฟเฟกต์การสัมผัสที่ซับซ้อนมากขึ้น
องค์ประกอบอื่นๆ ในการตอบสนองการคลิกที่ตรงใจมีความซับซ้อนกว่า และต้องมีความรู้เกี่ยวกับ LRA ที่ใช้ในอุปกรณ์ ใช้รูปแบบคลื่นที่สร้างไว้ล่วงหน้าของอุปกรณ์และค่าคงที่ที่แพลตฟอร์มให้ไว้เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ซึ่งจะช่วยให้คุณทำสิ่งต่อไปนี้ได้
- แสดงเอฟเฟกต์และองค์ประกอบพื้นฐานที่ชัดเจน
- ต่อกันเพื่อสร้างเอฟเฟกต์การสัมผัสแบบใหม่
ค่าคงที่และองค์ประกอบพื้นฐานของการสัมผัสที่กำหนดไว้ล่วงหน้าเหล่านี้จะช่วยเร่งงานของคุณได้เป็นอย่างมากขณะสร้างเอฟเฟกต์การสัมผัสคุณภาพสูง