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