เอกสารนี้จะแนะนำ API การโต้ตอบการสัมผัสต่างๆ ที่มีใน Android โดยอธิบายวิธีสร้างเอฟเฟกต์การตอบสนองแบบรู้สึกได้ต่างๆ และวิธีตรวจสอบ การรองรับอุปกรณ์ที่จำเป็น keywords_public: > Android, haptics, APIs, vibration, HapticFeedbackConstants, VibrationEffect, envelope haptics, haptic feedback, notification, amplitude control
ส่วนนี้จะแนะนำ API การโต้ตอบการสัมผัสต่างๆ ที่มีใน Android นอกจากนี้ ยังครอบคลุมถึงเวลาและวิธีตรวจสอบการสนับสนุนอุปกรณ์ที่จำเป็นเพื่อให้มั่นใจว่าเอฟเฟกต์การสั่นจะทำงานตามที่คุณต้องการ
การสร้างเอฟเฟกต์การสั่นมีหลายวิธี และสิ่งสำคัญคือต้องพิจารณาหลักการออกแบบการโต้ตอบการสัมผัสของ Android เมื่อเลือกวิธีใดวิธีหนึ่ง ตารางต่อไปนี้สรุปแอตทริบิวต์ระดับสูงของแต่ละ แนวทาง
- ความพร้อมใช้งานมีความสำคัญอย่างยิ่งเมื่อวางแผนการทำงานสำรอง และต้องใช้ร่วมกับการตรวจสอบการรองรับอุปกรณ์แต่ละเครื่อง
- การสั่นที่ชัดเจนคือความรู้สึกที่คมชัดและสะอาด ซึ่งไม่รบกวนผู้ใช้
- การสั่นที่สมจริงแสดงอารมณ์ได้ดีกว่าและ มักต้องใช้ฮาร์ดแวร์ที่มีฟีเจอร์หลากหลายกว่า
| แพลตฟอร์ม API | ความพร้อมใช้งาน | ล้างการโต้ตอบการสัมผัส | การโต้ตอบการสัมผัสที่สมบูรณ์ |
|---|---|---|---|
| HapticFeedbackConstants | Android 1.5 ขึ้นไป (ต่อค่าคงที่) |
||
| Predefined VibrationEffect | Android 10 ขึ้นไป | ||
VibrationEffect องค์ประกอบ (แนะนำ) |
Android 16 ขึ้นไป (ไตรมาสที่ 4 ปี 2569) | ||
VibrationEffectองค์ประกอบพื้นฐาน |
Android 11 ขึ้นไป (ต่อค่าคงที่) | ||
| การสั่นแบบเปิด/ปิด แบบครั้งเดียว และแบบรูปคลื่น | Android 1 |
นอกจากนี้ API การแจ้งเตือนที่อธิบายไว้ใน หน้านี้ยังช่วยให้คุณปรับแต่งเอฟเฟกต์การสั่นที่เล่นสำหรับการแจ้งเตือน ที่เข้ามาได้ด้วย
นอกจากนี้ หน้านี้ยังอธิบายแนวคิดเพิ่มเติมที่ครอบคลุมพื้นผิว API ด้วย
- อุปกรณ์มีระบบสั่นไหม
- การควบคุมแอมพลิจูดช่วยให้เอฟเฟกต์การสัมผัสราบรื่นและสมบูรณ์ยิ่งขึ้น แต่ไม่รองรับในอุปกรณ์บางรุ่น
VibrationAttributes()ช่วยจัดประเภท การสั่นตามการใช้งาน เพื่อให้มั่นใจว่าระบบจะใช้การตั้งค่าผู้ใช้ที่เหมาะสม เพื่อไม่ให้ผู้ใช้ประหลาดใจ
HapticFeedbackConstants
คลาส HapticFeedbackConstants มีค่าคงที่ตามการดำเนินการเพื่อให้แอปเพิ่มการตอบสนองแบบสัมผัสที่สอดคล้องกันในประสบการณ์การใช้งานอุปกรณ์ได้
แทนที่จะให้แต่ละแอปมีเอฟเฟกต์ที่แตกต่างกันสำหรับการดำเนินการทั่วไป
ความเข้ากันได้และข้อกำหนด
การใช้วิธี View.performHapticFeedback กับค่าคงที่เหล่านี้ ไม่จำเป็นต้องมีสิทธิ์พิเศษใดๆ สำหรับแอป โดยขึ้นอยู่กับพร็อพเพอร์ตี้ View.hapticFeedbackEnabled ซึ่งหากตั้งค่าเป็น false จะปิดใช้การเรียกใช้การตอบสนองแบบรู้สึกได้ทั้งหมดในมุมมอง รวมถึงการเรียกใช้เริ่มต้น การตั้งค่าหลักที่เกี่ยวข้องคือพร็อพเพอร์ตี้ View.hapticFeedbackEnabled ซึ่งหากตั้งค่าเป็น false จะปิดใช้การเรียกใช้การตอบสนองแบบรู้สึกได้ทั้งหมดในมุมมอง รวมถึงการเรียกใช้เริ่มต้น นอกจากนี้ วิธีการนี้ยังใช้การตั้งค่าระบบของผู้ใช้เพื่อเปิดใช้การตอบสนองแบบสัมผัสด้วย
ข้อควรพิจารณาด้านความเข้ากันได้เพียงอย่างเดียวคือระดับ SDK ของค่าคงที่ที่เฉพาะเจาะจง สำหรับการดำเนินการ
คุณไม่จำเป็นต้องระบุลักษณะการทำงานสำรองเมื่อใช้ HapticFeedbackConstants
การใช้ HapticsFeedbackConstants
ดูรายละเอียดเกี่ยวกับการใช้ HapticFeedbackConstants ได้ที่เพิ่มการตอบสนองแบบรู้สึกได้ให้กับ
เหตุการณ์
กำหนดไว้ล่วงหน้า VibrationEffect
คลาส VibrationEffect
มีค่าคงที่ที่กำหนดไว้ล่วงหน้าหลายรายการ เช่น CLICK, TICK และ
DOUBLE_CLICK เอฟเฟกต์เหล่านี้อาจได้รับการเพิ่มประสิทธิภาพสำหรับอุปกรณ์
ความเข้ากันได้และข้อกำหนด
การเล่นVibrationEffectใดๆ ต้องใช้สิทธิ์ VIBRATE ในไฟล์
Manifest ของแอป
คุณไม่จำเป็นต้องระบุลักษณะการทำงานสำรองเมื่อใช้ VibrationEffect ที่กำหนดไว้ล่วงหน้า เนื่องจากค่าคงที่ที่ไม่มีการติดตั้งใช้งานที่เพิ่มประสิทธิภาพสำหรับอุปกรณ์จะกลับไปใช้การสำรองข้อมูลแพลตฟอร์มมาตรฐาน
API Vibrator.areEffectsSupported และ Vibrator.areAllEffectsSupported
ใช้เพื่อตรวจสอบว่ามีการติดตั้งใช้งานที่เพิ่มประสิทธิภาพสำหรับอุปกรณ์หรือไม่
คุณยังคงใช้เอฟเฟกต์ที่กำหนดไว้ล่วงหน้าได้โดยไม่ต้องใช้การติดตั้งใช้งานที่เพิ่มประสิทธิภาพ และ
ใช้การสำรองข้อมูลแพลตฟอร์มมาตรฐาน ดังนั้น คุณจะต้องการใช้
areEffectsSupported API เหล่านี้ก็ต่อเมื่อแอปพลิเคชันต้องการพิจารณาว่าเอฟเฟกต์ได้รับการเพิ่มประสิทธิภาพสำหรับอุปกรณ์หรือไม่
วิธีการตรวจสอบเอฟเฟกต์จะแสดงค่าใดค่าหนึ่งต่อไปนี้
VIBRATION_EFFECT_SUPPORT_YESแสดงว่าอุปกรณ์มีการรองรับเอฟเฟกต์นี้ที่ได้รับการเพิ่มประสิทธิภาพแล้วVIBRATION_EFFECT_SUPPORT_NOแสดงว่าอุปกรณ์ไม่มีการรองรับที่เพิ่มประสิทธิภาพ แต่ยังคงใช้ แพลตฟอร์มสำรองVIBRATION_EFFECT_SUPPORT_UNKNOWNแสดงว่าระบบไม่ทราบว่าการติดตั้งใช้งานได้รับการเพิ่มประสิทธิภาพหรือไม่
เนื่องจากค่า UNKNOWN บ่งชี้ว่า API การตรวจสอบไม่พร้อมใช้งาน โดยปกติแล้ว ระบบจะ
แสดงค่านี้สำหรับเอฟเฟกต์ทั้งหมดหรือไม่มีเลย อุปกรณ์เหล่านี้จะเปลี่ยนกลับโดยอัตโนมัติ
การใช้ VibrationEffect ที่กำหนดไว้ล่วงหน้า
ดูรายละเอียดเกี่ยวกับการใช้ VibrationEffect ที่กำหนดไว้ล่วงหน้าได้ที่
ใช้ VibrationEffect ที่กำหนดไว้ล่วงหน้าเพื่อสร้างการตอบสนองแบบสัมผัส
Envelope VibrationEffect
การสั่นตามซองจดหมายช่วยให้ควบคุมแอมพลิจูด
และความถี่ของการสั่นได้อย่างแม่นยำเมื่อเวลาผ่านไปโดยการกำหนดลำดับของจุดควบคุม ซึ่งช่วยให้นักพัฒนาแอปสร้างประสบการณ์การตอบสนองแบบรู้สึกได้ที่สมบูรณ์และละเอียดอ่อนยิ่งขึ้นได้ คุณสร้างการสั่นเหล่านี้ได้โดยใช้คลาส BasicEnvelopeBuilder และ WaveformEnvelopeBuilder
ความเข้ากันได้และข้อกำหนด
หากต้องการเล่นเอฟเฟกต์การสั่นใดๆ แอปของคุณต้องประกาศสิทธิ์ VIBRATE ในไฟล์ Manifest ของแอป
หากต้องการตรวจสอบว่าอุปกรณ์รองรับเอฟเฟกต์ซองจดหมายหรือไม่ ให้โทรหา
Vibrator.areEnvelopeEffectsSupported()
เครื่องมือสร้างซองจดหมายพื้นฐาน
เอฟเฟกต์ซองจดหมายต้องเริ่มต้นและสิ้นสุดด้วยความเข้ม \( 0.0 \)เพื่อสร้างประสบการณ์การสั่นที่ราบรื่นและไร้รอยต่อ API จะบังคับใช้โดยการแก้ไข ความเข้มเริ่มต้นเป็น 0 และจะส่งข้อยกเว้นหากความเข้มสิ้นสุดไม่ใช่ 0 ข้อจำกัดนี้จะป้องกันไม่ให้เกิดเอฟเฟกต์ไดนามิกที่ไม่พึงประสงค์ในการสั่นเนื่องจากความไม่ต่อเนื่องของแอมพลิจูด ซึ่งอาจส่งผลเสียต่อการรับรู้การสัมผัสของผู้ใช้
เฟรมเวิร์กกำหนดให้อุปกรณ์ที่รองรับฟีเจอร์นี้สามารถจัดการระยะเวลาขั้นต่ำ 20 มิลลิวินาทีระหว่างจุดควบคุมและมีจุดอย่างน้อย 16 จุดสำหรับเอฟเฟกต์ซองจดหมาย เพื่อให้การแสดงผลเอฟเฟกต์ซองจดหมายสอดคล้องกันในอุปกรณ์ต่างๆ
เครื่องมือสร้างซองจดหมาย Waveform
เฟรมเวิร์กจะไม่แก้ไขค่าความถี่และค่าแอมพลิจูดที่นักพัฒนาแอปขอ อย่างไรก็ตาม API ยังแก้ไขแอมพลิจูดเริ่มต้นที่ ศูนย์เพื่อให้การเปลี่ยนผ่านเป็นไปอย่างราบรื่น
Android มี API สำหรับการค้นหาความสามารถที่สำคัญของอุปกรณ์เพื่อช่วยคุณเพิ่มประสิทธิภาพเอฟเฟกต์ซองจดหมายของรูปคลื่นของแอปและมอบ ความเข้ากันได้ในอุปกรณ์ต่างๆ เมธอดเหล่านี้ให้ข้อมูลเกี่ยวกับข้อจำกัดของอุปกรณ์ เช่น ระยะเวลาการเปลี่ยนผ่านสูงสุดและต่ำสุดระหว่างจุดควบคุม และจำนวนจุดควบคุมสูงสุดที่รองรับสำหรับเอฟเฟกต์เดียว
getMaxSize()- ดึงข้อมูลจำนวนสูงสุดของจุดควบคุมที่รองรับสำหรับเอฟเฟกต์ซองจดหมาย
getMinControlPointDurationMillis()- ดึงข้อมูลระยะเวลาขั้นต่ำที่รองรับเป็นมิลลิวินาทีระหว่างจุดควบคุม 2 จุด ภายในเอฟเฟ็กต์ซองจดหมาย
getMaxControlPointDurationMillis()- ดึงข้อมูลระยะเวลาสูงสุดที่รองรับเป็นมิลลิวินาทีระหว่างจุดควบคุม 2 จุด ภายในเอฟเฟกต์ซองจดหมาย
getMaxDurationMillis()- เรียกข้อมูลระยะเวลาสูงสุดที่รองรับสำหรับเอฟเฟกต์เอนเวโลปเป็นมิลลิวินาที
หากเอฟเฟกต์เกินข้อจำกัดของอุปกรณ์ เช่น อนุญาตให้มีจุดควบคุมมากเกินไปหรือระยะเวลานานเกินสูงสุด เฟรมเวิร์กจะปรับเอฟเฟกต์โดยอัตโนมัติให้พอดีกับขอบเขตที่อนุญาต กระบวนการปรับนี้พยายาม รักษารูปแบบและความรู้สึกดั้งเดิมของการออกแบบให้ได้มากที่สุด
การใช้ Envelope VibrationEffects
ดูรายละเอียดเกี่ยวกับการสร้างเอฟเฟกต์รูปคลื่นของซองจดหมายได้ที่หัวข้อสร้างรูปคลื่นการสั่นด้วยซองจดหมาย
VibrationEffect องค์ประกอบ
ตั้งแต่ Android 16 (26Q4) เป็นต้นไป VibrationEffect.Builder จะเป็น API ที่แนะนำ
สำหรับการสร้างเอฟเฟกต์การสัมผัสที่สมบูรณ์และสื่ออารมณ์โดยการจัดลำดับองค์ประกอบการสัมผัสหลายรายการตามไทม์ไลน์ที่ออกแบบไว้ โดยจะแทนที่
VibrationEffect.Composition ด้วย
การเสนอการกำหนดเวลาที่ยึดตามไทม์ไลน์ การห่อหุ้มแบบอะตอม การรองรับเหตุการณ์แบบผสม
(การรวมค่าที่กำหนดล่วงหน้าและซองจดหมาย) และการเปลี่ยนกลับอัตโนมัติในตัว
องค์ประกอบที่ใช้สร้างสรรค์
เครื่องมือสร้างช่วยให้คุณจัดลำดับองค์ประกอบการสัมผัสต่อไปนี้ได้
VibrationEffect.Preset: ความรู้สึกสัมผัสที่กำหนดไว้ล่วงหน้าซึ่งแสดงถึง การสั่นสั้นๆ ทั่วไป เช่นPRESET_CLICK,PRESET_TICKและPRESET_LOW_TICKค่าที่กำหนดล่วงหน้าจะแทนที่ค่าดั้งเดิมแบบย่อจากVibrationEffect.CompositionAPI สำหรับเอฟเฟกต์ที่ยาว ต่อเนื่อง หรือเพิ่มขึ้น (ก่อนหน้านี้จัดการโดยการเพิ่มขึ้น การลดลง และองค์ประกอบพื้นฐานอื่นๆ) ให้ใช้ซองจดหมาย (PWLE) แทน คุณปรับขนาดค่าที่กำหนดล่วงหน้าจาก0.0fเป็น1.0fได้โดยใช้Preset.create(presetId, scale)VibrationEffect.Envelope: เอนเวโลปเชิงเส้นแบบเป็นช่วง (PWLE) ที่สร้างขึ้นโดยใช้BasicEnvelopeBuilder(ที่มีความหนักและความคมชัด) หรือWaveformEnvelopeBuilder(ที่มีความถี่และแอมพลิจูด) ซองจดหมายสร้างขึ้นโดยใช้Envelope.create(builder)VibrationEffect.Event: เหตุการณ์ในไทม์ไลน์ที่ดึงมาจากVibrationEffectที่มีอยู่โดยใช้getEvents()โดยคุณเพิ่มข้อมูลเหล่านี้พร้อมออฟเซ็ตไทม์ไลน์ได้โดยใช้addEvents(startTimeShiftMillis, events)
การจัดกำหนดการและการตรวจสอบไทม์ไลน์
ระบบจะเพิ่มองค์ประกอบแต่ละรายการลงในเครื่องมือสร้างโดยมี startTimeMillis ซึ่งแสดงถึง
ออฟเซ็ตเวลา (เป็นมิลลิวินาที) จากจุดเริ่มต้นของการเรียบเรียง
- การตรวจสอบขณะสร้าง: ต้องเพิ่มองค์ประกอบตามลำดับเวลาเริ่มต้นที่เพิ่มขึ้นอย่างเคร่งครัด
เครื่องมือสร้างจะทำการตรวจสอบอย่างเต็มที่ในเวลาบิลด์โดยตรวจสอบเทียบกับระยะเวลาขั้นต่ำ (เช่น 1 มิลลิวินาทีสำหรับค่าที่กำหนดล่วงหน้าหรือระยะเวลาที่ทราบสำหรับเอนเวโลป) หากตรวจพบการทับซ้อนกันในเวลาบิลด์ ระบบจะแสดง
IllegalArgumentException - การจัดแนวเวลาการเล่น: เฟรมเวิร์กจะให้การสนับสนุนเวลาอย่างเต็มที่ ในระหว่างการเล่น หากเหตุการณ์ก่อนหน้ายังคงดำเนินการอยู่เมื่อถึงเวลาเริ่มต้นของ เหตุการณ์ที่กำหนดเวลาไว้ถัดไป เฟรมเวิร์กจะเลื่อน เหตุการณ์ที่ตามมาไปยังช่วงเวลาที่เร็วที่สุดถัดไปโดยอัตโนมัติ ซึ่งจะช่วยป้องกันไม่ให้เหตุการณ์ซ้อนทับกันในการเล่นจริง พร้อมทั้งรับประกันว่า จะไม่มีการทิ้งเหตุการณ์การสั่น
เอฟเฟกต์ซ้ำ
คุณเพิ่มเอฟเฟกต์ซ้ำลงในองค์ประกอบได้โดยใช้
setRepeatingEffect(startTimeMillis, repeatingEffect, durationMillis) เมื่อกำหนดค่า
เอฟเฟกต์ซ้ำแล้ว คุณจะเพิ่มองค์ประกอบอื่นๆ ลงใน
เครื่องมือสร้างไม่ได้
การรองรับสำรอง
ระบบจะเปิดใช้การรองรับการเปลี่ยนเส้นทางอัตโนมัติระดับเฟรมเวิร์กสำหรับการสั่นที่สร้างโดย VibrationEffect.Builder ตามค่าเริ่มต้น
- การทำงานแทนแพลตฟอร์มแบบโปร่งใส: หากอุปกรณ์ไม่รองรับ
Presetที่ขอหรือEnvelopeพื้นฐาน เฟรมเวิร์กจะแทนที่องค์ประกอบที่ไม่รองรับด้วยการสั่นที่รองรับที่เหมาะสมโดยอัตโนมัติ ในรันไทม์ตามความพยายามอย่างเต็มที่ แอปของคุณไม่จำเป็นต้อง ตรวจสอบความสามารถของอุปกรณ์ (เช่นisPresetSupported) ด้วยตนเองก่อน เล่นผลงานที่สร้างด้วยVibrationEffect.Builder - ข้อยกเว้นสำหรับ
WaveformEnvelopeBuilder: เอฟเฟกต์ Envelope ที่สร้างโดยWaveformEnvelopeBuilder(ซึ่งระบุความถี่ทางกายภาพสัมบูรณ์ ในหน่วยเฮิรตซ์และแอมพลิจูดในหน่วย G) จะไม่รองรับการเปลี่ยนไปใช้ตัวเลือกสำรองโดยอัตโนมัติ เนื่องจาก PWLE ขั้นสูงอาศัยเส้นโค้งความถี่ของฮาร์ดแวร์ที่เฉพาะเจาะจง (FOAM) การแทนที่โดยอัตโนมัติจึงอาจทำให้เจตนารมณ์ในการออกแบบ ลดลง หากอุปกรณ์ไม่รองรับเอฟเฟกต์ PWLE หรือความถี่ที่ขอ ระบบจะไม่เล่นการสั่นดังกล่าว หากต้องการให้ใช้งานได้กับทุกอุปกรณ์ ให้ใช้BasicEnvelopeBuilder
การใช้ VibrationEffect.Builder
ดูตัวอย่างโค้ดเกี่ยวกับการสร้างเอฟเฟกต์ด้วย VibrationEffect.Builder ได้ที่
สร้างคอมโพสิชันที่ยึดตามไทม์ไลน์ด้วย
VibrationEffect.Builder
VibrationEffect องค์ประกอบพื้นฐาน
องค์ประกอบดั้งเดิมของ VibrationEffect คือเอฟเฟกต์การสั่นที่สร้างขึ้น
โดยใช้ VibrationEffect.startComposition API API นี้ช่วยให้คุณสร้าง
ลำดับขององค์ประกอบพื้นฐานได้
ความเข้ากันได้และข้อกำหนด
การเล่นVibrationEffectใดๆ ต้องใช้สิทธิ์ VIBRATE ในไฟล์
Manifest ของแอป
ตรวจสอบการรองรับองค์ประกอบพื้นฐาน
ดังนั้น เมื่อใช้ VibrationEffect.Composition API คุณต้องตรวจสอบการรองรับแต่ละองค์ประกอบโดยใช้ Vibrator.arePrimitivesSupported หรือ Vibrator.areAllPrimitivesSupported ก่อนเล่น
คุณสามารถเรียกข้อมูลการรองรับต่อองค์ประกอบโดยใช้เมธอด
Vibrator.arePrimitivesSupported หรืออาจตรวจสอบชุดขององค์ประกอบพื้นฐานพร้อมกันโดยใช้วิธี Vibrator.areAllPrimitivesSupported
ซึ่งเทียบเท่ากับการANDการรองรับต่อองค์ประกอบพื้นฐาน
การใช้VibrationEffectองค์ประกอบดั้งเดิม
ดูรายละเอียดเกี่ยวกับการใช้VibrationEffectองค์ประกอบดั้งเดิมได้ที่
สร้างองค์ประกอบดั้งเดิมของการสั่น
การสั่นแบบเปิด/ปิด แบบครั้งเดียว และแบบรูปคลื่น
รูปแบบการเปิด/ปิดเครื่องสั่นแบบง่ายที่มีระยะเวลาที่กำหนดค่าได้เป็นรูปแบบการสั่นที่เก่าแก่ที่สุดที่รองรับใน Android โดยปกติแล้ว API เหล่านี้จะไม่สอดคล้องกับหลักการออกแบบการสั่น เนื่องจากอาจสร้างการสั่นที่ส่งเสียงหึ่งๆ ได้ จึงควรหลีกเลี่ยงการใช้ API เหล่านี้ เว้นแต่จะไม่มีทางเลือกอื่น
Use Case ที่พบบ่อยที่สุดสำหรับการสั่นแบบเปิด/ปิดคือการแจ้งเตือน ซึ่งไม่ว่าอย่างไรก็ตาม การสั่นบางอย่างก็เป็นที่ต้องการ การสั่นแบบรูปคลื่นยังช่วยให้รูปแบบซ้ำได้ไม่สิ้นสุด ซึ่งเป็นลักษณะเดียวกับเสียงเรียกเข้า
รูปแบบการสั่นครั้งเดียวหมายถึงการสั่น 1 ครั้งเป็นเวลา N มิลลิวินาที
รูปแบบรูปคลื่นมี 2 ประเภท ได้แก่
- เวลาเท่านั้น รูปคลื่นประเภทนี้คือคำอธิบายของระยะเวลาที่สลับกัน ระหว่างปิดและเปิด โดยการจับเวลาจะเริ่มเมื่อ ระยะเวลาที่ปิดอยู่ ดังนั้นรูปแบบรูปคลื่นมักจะเริ่มต้นด้วยค่า 0 เพื่อระบุให้เริ่มสั่นทันที
- ช่วงเวลาและแอมพลิจูด รูปคลื่นประเภทนี้มีอาร์เรย์แอมพลิจูดเพิ่มเติม เพื่อให้ตรงกับตัวเลขเวลาแต่ละตัว แทนที่จะเป็นรูปแบบเปิด/ปิดโดยนัย ของรูปแบบแรก อย่างไรก็ตาม คุณควรตรวจสอบว่าอุปกรณ์รองรับ การควบคุมแอมพลิจูดเพื่อให้แน่ใจว่าสามารถปรับขนาดได้ตามที่ต้องการ
ความเข้ากันได้และข้อกำหนด
เนื่องจากการสั่นแบบเปิด/ปิดเป็นรูปแบบการสั่นที่เก่าแก่ที่สุด อุปกรณ์แทบทั้งหมดที่มีเครื่องสั่นจึงรองรับการสั่นประเภทนี้ ดังที่อธิบายไว้ในส่วนท้ายของหน้านี้
การเล่นการเรียกใช้ VibrationEffect หรือการเรียกใช้สไตล์เก่ากว่า vibrate ต้องมีสิทธิ์ VIBRATE ในไฟล์ Manifest ของแอป
เมื่อใช้ค่าแอมพลิจูดที่แตกต่างกันในรูปคลื่น เราขอแนะนำให้คุณตรวจสอบว่าอุปกรณ์รองรับการควบคุมแอมพลิจูด
ตรวจสอบว่าอุปกรณ์รองรับการควบคุมแอมพลิจูดหรือไม่
ระบบจะปัดค่าแอมพลิจูดที่ไม่ใช่ 0 ขึ้นเป็น 100% ในอุปกรณ์ที่ไม่มีการควบคุมแอมพลิจูด
ดังนั้นจึงควรตรวจสอบว่ามีการรองรับหรือไม่โดยใช้
Vibrator.hasAmplitudeControl ดูรายละเอียดเพิ่มเติมได้ที่การควบคุมแอมพลิจูด
คุณควรพิจารณาอย่างรอบคอบว่าเอฟเฟกต์มีคุณภาพเพียงพอหรือไม่หากไม่มี การควบคุมแอมพลิจูด การเปลี่ยนกลับไปใช้การสั่นแบบเปิด/ปิดที่ออกแบบมาโดยเฉพาะอาจ ดีกว่า
การใช้การสั่นแบบเปิด/ปิด
ใน SDK ระดับใหม่กว่า เราได้รวมโหมดการสั่นทั้งหมดไว้ในคลาส VibrationEffect เดียวที่สื่ออารมณ์ ซึ่งจะสร้างการสั่นแบบง่ายๆ เหล่านี้โดยใช้ VibrationEffect.createOneShot หรือ VibrationEffect.createWaveform
API การแจ้งเตือน
เมื่อปรับแต่งการแจ้งเตือนของแอป คุณสามารถใช้ API อย่างใดอย่างหนึ่งต่อไปนี้ เพื่อเชื่อมโยงรูปแบบกับแต่ละแชแนลการแจ้งเตือน
- AndroidX
- Android
NotificationChannel.setVibrationPattern- (เลิกใช้งานแล้ว)
NotificationBuilder.setVibrate
รูปแบบทั้งหมดนี้ใช้รูปแบบรูปคลื่นเปิด/ปิดพื้นฐาน ตามที่อธิบายไว้ก่อนหน้านี้ โดยรายการแรกคือระยะเวลาก่อนเปิด เครื่องสั่น
แนวคิดทั่วไป
แนวคิดหลายอย่างใช้ได้กับ API Surface ที่อธิบายไว้ข้างต้น
อุปกรณ์มีระบบสั่นไหม
คุณรับคลาส Vibrator ที่ไม่ใช่ Null ได้จาก
context.getSystemService(Vibrator.class) หากอุปกรณ์ไม่มี
เครื่องสั่น การเรียกใช้ API การสั่นจะไม่มีผลใดๆ ดังนั้นแอปจึงไม่จำเป็นต้อง
จำกัดการตอบสนองแบบสัมผัสทั้งหมดตามเงื่อนไข อย่างไรก็ตาม หากจำเป็น แอปพลิเคชัน
สามารถเรียก hasVibrator() เพื่อ
ตรวจสอบว่านี่คือไวเบรเตอร์จริง (true) หรือไวเบรเตอร์จำลอง (false)
ผู้ใช้ปิดใช้การตอบสนองแบบสั่นเมื่อสัมผัสไหม
การติดตั้งใช้งานที่กำหนดเองบางอย่างอาจต้องตรวจสอบด้วยตนเองว่าผู้ใช้ได้ปิดการตั้งค่าการตอบสนองต่อการสัมผัสของ Android ทั้งหมดหรือไม่ ในกรณีนี้ควรระงับเอฟเฟกต์การตอบสนองต่อการสัมผัส การตั้งค่านี้
สามารถค้นหาได้โดยใช้คีย์ HAPTIC_FEEDBACK_ENABLED โดยค่า 0
หมายถึงปิดใช้
แอตทริบิวต์การสั่น
คุณสามารถระบุแอตทริบิวต์การสั่น (ปัจจุบันอยู่ในรูปแบบของ AudioAttributes) เพื่อช่วยให้ระบบทราบวัตถุประสงค์ของการสั่น คุณต้องระบุค่านี้เมื่อเริ่มการสั่นเมื่อแอปอยู่ในเบื้องหลัง
เนื่องจากระบบรองรับเฉพาะการสัมผัสที่ดึงดูดความสนใจสำหรับการใช้งานในเบื้องหลัง
การสร้าง AudioAttributes จะอธิบายไว้ในเอกสารประกอบของคลาส และ
ควรพิจารณาเป็นการสั่นสะเทือนมากกว่าเสียง
โดยส่วนใหญ่แล้ว ประเภทเนื้อหาจะเป็น CONTENT_TYPE_SONIFICATION
และอาจมีการใช้งานค่าต่างๆ เช่น USAGE_ASSISTANCE_SONIFICATION สำหรับ
การตอบสนองต่อการแตะในเบื้องหน้า หรือ USAGE_ALARM สำหรับการปลุกใน
เบื้องหลัง การแจ้งว่ามีเสียงจะไม่มีผลต่อการสั่น
การควบคุมแอมพลิจูด
หากการสั่นเตือนมีการควบคุมแอมพลิจูด ก็จะสามารถเล่นการสั่นที่มีความเข้มต่างกันได้ ความสามารถนี้มีความสำคัญต่อการสร้าง การโต้ตอบการสัมผัสที่สมบูรณ์ รวมถึงอาจช่วยให้ผู้ใช้ควบคุม ความหนักของการโต้ตอบการสัมผัสเริ่มต้นได้
คุณตรวจสอบการรองรับการควบคุมแอมพลิจูดได้โดยการเรียกใช้
Vibrator.hasAmplitudeControl หากอุปกรณ์สั่นไม่รองรับแอมพลิจูด ค่าแอมพลิจูดทั้งหมดจะแมปเป็นปิดหรือเปิดโดยขึ้นอยู่กับว่าค่าเป็น 0 หรือไม่ใช่ 0 ดังนั้น แอปพลิเคชันที่ใช้การโต้ตอบการสัมผัสที่สมบูรณ์พร้อมแอมพลิจูดที่แตกต่างกัน ควรพิจารณาปิดใช้หากอุปกรณ์ไม่มีการควบคุมแอมพลิจูด
รองรับเอฟเฟกต์ซองจดหมาย
การรองรับและเปิดใช้เอฟเฟกต์เอนเวโลปของเครื่องสั่นจะช่วยให้สร้างการสั่นที่ไดนามิกและซับซ้อนมากขึ้นได้ ซึ่งจะช่วยให้ควบคุมความหนักและความคมชัดได้อย่างแม่นยำยิ่งขึ้นเพื่อประสบการณ์การโต้ตอบการสัมผัสที่สมบูรณ์ยิ่งขึ้น ใช้
Vibration.areEnvelopeEffectsSupported เพื่อดูว่าอุปกรณ์ของคุณ
รองรับฟีเจอร์นี้หรือไม่ หากไม่เป็นเช่นนั้น ระบบจะไม่สนใจการสั่นตามซอง