เอกสารนี้อธิบาย Linear Resonant Actuators (LRA) ซึ่งเป็นตัวกระตุ้นการสั่นทั่วไปในอุปกรณ์ Android โดยให้รายละเอียดลักษณะของ LRA วิธีสร้างการตอบสนองแบบรู้สึกได้ และวิธีสร้างรูปแบบการสัมผัสที่มีประสิทธิภาพโดยใช้ Android API keywords_public: > การโต้ตอบการสัมผัสใน Android, ตัวกระตุ้นการสัมผัส, Linear Resonant Actuators, LRA, การสั่น, การตอบสนองแบบรู้สึกได้, VibratorFrequencyProfile, VibrationEffect, UI ของ Android
แอคทูเอเตอร์การสั่นที่พบบ่อยที่สุดในอุปกรณ์ Android คือแอคทูเอเตอร์เรโซแนนซ์เชิงเส้น (LRA) LRA จะจำลองความรู้สึกของการคลิกปุ่ม บนพื้นผิวกระจกที่ไม่ตอบสนอง สัญญาณการคลิกที่ชัดเจนและคมชัด โดยปกติจะใช้เวลา 10-20 มิลลิวินาที ความรู้สึกนี้ทำให้การโต้ตอบของผู้ใช้ดูเป็นธรรมชาติมากขึ้น สำหรับแป้นพิมพ์เสมือน การตอบสนองต่อการคลิกนี้จะช่วยเพิ่มความเร็วในการพิมพ์และลดข้อผิดพลาดได้
LRA มีความถี่เรโซแนนซ์ที่พบบ่อย 2-3 ความถี่ ดังนี้
- LRA บางตัวมีความถี่เรโซแนนซ์ในช่วง 200-300 Hz ซึ่งตรงกับความถี่ที่ผิวหนังของมนุษย์มีความไวต่อการสั่นสะเทือนมากที่สุด โดยปกติแล้ว ความรู้สึกของการสั่นในช่วงความถี่นี้จะ อธิบายได้ว่าราบรื่น คมชัด และทะลุทะลวง
- ส่วน LRA รุ่นอื่นๆ มีความถี่เรโซแนนซ์ต่ำกว่าที่ประมาณ 150 Hz โดย ความรู้สึกจะนุ่มนวลและเต็มอิ่มกว่า (ในมิติ)
เมื่อป้อนแรงดันไฟฟ้าเดียวกันที่ความถี่ 2 ความถี่ที่แตกต่างกัน แอมพลิจูดเอาต์พุตการสั่นอาจแตกต่างกัน ยิ่งความถี่อยู่ห่างจากความถี่เรโซแนนซ์ของ LRA มากเท่าใด แอมพลิจูดการสั่นก็จะยิ่งต่ำลง
เอฟเฟกต์การสั่นของอุปกรณ์หนึ่งๆ จะใช้ทั้งตัวกระตุ้นการสั่นและไดรเวอร์ ไดรเวอร์แบบสัมผัสที่มีฟีเจอร์โอเวอร์ไดรฟ์และการเบรกแบบแอ็กทีฟจะช่วยลด เวลาที่ใช้ในการเพิ่มขึ้นและเสียงกริ่งของ LRA ซึ่งจะทำให้การสั่นตอบสนองได้ดีขึ้นและชัดเจนยิ่งขึ้น
การเร่งความเร็วเอาต์พุตของไวเบรเตอร์
การแมปความถี่กับการเร่งความเร็วเอาต์พุต (FOAM) อธิบายการเร่งความเร็วเอาต์พุตสูงสุด
ที่ทำได้ (ในหน่วย G peak) ที่ความถี่การสั่นสะเทือนที่กำหนด (ในหน่วย
เฮิรตซ์) ตั้งแต่ Android 16 (ระดับ API 36) เป็นต้นไป แพลตฟอร์มจะให้การรองรับในตัวสำหรับการแมปนี้ผ่าน VibratorFrequencyProfile คุณสามารถใช้คลาสนี้ร่วมกับ API ของซองจดหมายพื้นฐานและขั้นสูงเพื่อสร้าง
เอฟเฟกต์การสั่นได้
มอเตอร์ LRA ส่วนใหญ่มีจุดสูงสุดเพียงจุดเดียวใน FOAM ซึ่งมักอยู่ใกล้กับความถี่เรโซแนนซ์ โดยทั่วไปแล้ว การเร่งความเร็วจะลดลงแบบทวีคูณเมื่อความถี่เบี่ยงเบน จากช่วงนี้ เส้นโค้งอาจไม่สมมาตรและอาจมีช่วงที่คงที่ รอบความถี่เรโซแนนซ์เพื่อป้องกันไม่ให้มอเตอร์เสียหาย
แปลงที่อยู่ติดกันแสดงตัวอย่าง FOAM สำหรับมอเตอร์ LRA
เกณฑ์การตรวจจับการรับรู้ของมนุษย์
เกณฑ์การตรวจจับการรับรู้ของมนุษย์หมายถึงความเร่งขั้นต่ำของ การสั่นสะเทือนที่บุคคลตรวจจับได้อย่างน่าเชื่อถือ ระดับนี้จะแตกต่างกันไปตาม ความถี่ของการสั่น
พล็อตที่อยู่ติดกันแสดงเกณฑ์การตรวจจับการรับรู้การสัมผัสของมนุษย์ใน ความเร่งเป็นฟังก์ชันของความถี่ชั่วคราว ข้อมูลเกณฑ์จะ แปลงจากเกณฑ์การเคลื่อนที่ในรูปที่ 1 ของ Bolanowski Jr., S. บทความของ J. และคณะ ปี 1988 "ช่อง 4 ช่องเป็นสื่อกลางด้านกลไกของการสัมผัส"
Android จะจัดการเกณฑ์นี้โดยอัตโนมัติใน BasicEnvelopeBuilder,
ซึ่งจะยืนยันว่าเอฟเฟกต์ทั้งหมดใช้ช่วงความถี่ที่สร้างแอมพลิจูด
การสั่นที่เกินเกณฑ์การตรวจจับการรับรู้ของมนุษย์อย่างน้อย
10 dB
บทแนะนำออนไลน์จะอธิบายเพิ่มเติมเกี่ยวกับการแปลงระหว่างแอมพลิจูดความเร่งกับแอมพลิจูดการกระจัด
ระดับความเร่งของการสั่น
การรับรู้ความแรงของการสั่นของมนุษย์ ซึ่งเป็นมาตรวัดการรับรู้ ไม่ได้เพิ่มขึ้น ตามแอมพลิจูดของการสั่น ซึ่งเป็นพารามิเตอร์ทางกายภาพ ความเข้มที่รับรู้ มีลักษณะเป็นระดับความรู้สึก (SL) ซึ่งกำหนดเป็นจำนวนเดซิเบลที่สูงกว่า เกณฑ์การตรวจจับที่ความถี่เดียวกัน
สามารถคำนวณแอมพลิจูดความเร่งของการสั่นที่สอดคล้องกัน (ใน G peak) ได้ ดังนี้
...โดยที่แอมพลิจูด 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 จะไม่ใช้ Conversion นี้และใช้ค่าเป็นแอมพลิจูดความเร่งเอาต์พุตที่ปรับให้เป็นมาตรฐานในพื้นที่ความเร่ง (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 // 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));
สร้างเอฟเฟกต์การสัมผัสที่ซับซ้อนมากขึ้น
องค์ประกอบอื่นๆ ในการตอบสนองต่อการคลิกที่น่าพอใจมีความซับซ้อนมากขึ้น ซึ่งต้องมีความรู้เกี่ยวกับ LRA ที่ใช้ในอุปกรณ์ ใช้อุปกรณ์ รูปคลื่นที่สร้างไว้ล่วงหน้าและค่าคงที่ที่แพลตฟอร์มมีให้เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ซึ่งจะช่วยให้คุณทำสิ่งต่อไปนี้ได้
- ใช้เอฟเฟกต์และองค์ประกอบพื้นฐานที่ชัดเจน
- เชื่อมต่อเพื่อสร้างเอฟเฟกต์การสั่นแบบใหม่
ค่าคงที่และองค์ประกอบพื้นฐานแบบสัมผัสที่กำหนดไว้ล่วงหน้าเหล่านี้จะช่วยให้คุณทำงานได้เร็วขึ้นมาก ขณะสร้างเอฟเฟกต์แบบสัมผัสคุณภาพสูง