การปรับปรุงเฟรมเวิร์ก Android ทั้งหมดที่สร้างขึ้นโดยอิงตามการโต้ตอบการสัมผัสขับเคลื่อนด้วยชุดหลักการ UX ที่พัฒนาไปในอัตราที่เท่ากัน หลักการปัจจุบัน เกี่ยวข้องกับการแทนที่การสั่นที่ดังด้วยการโต้ตอบการสัมผัสที่ชัดเจน และ การสำรวจการโต้ตอบการสัมผัสที่สมบูรณ์
รูปที่ 1 หลักการปัจจุบัน
ตารางต่อไปนี้แสดง API การโต้ตอบการสัมผัสทั้งหมดที่พร้อมใช้งาน
| API | วิธีการและค่าคงที่ | ปีที่เพิ่ม |
|---|---|---|
android.view.HapticFeedbackConstants |
|
ก่อนปี 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.View |
|
ก่อนปี 2016 |
android.os.Vibrator |
|
ก่อนปี 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.os.VibrationEffect |
|
2017 (Android 8) |
|
2019 (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 (Android 11) |
android.media.AudioAttributes.Builder |
|
2019 (Android 10) |
การสั่นแบบมีเสียงหึ่ง
ตั้งแต่เพจเจอร์และฟีเจอร์โฟน การสั่นแบบใช้กริ่งที่มีคุณภาพต่ำแต่ประหยัดพลังงาน มวลหมุนเยื้องศูนย์ (ERM) ถูกใช้แทนเสียงเรียกเข้าในโหมดเงียบ คอมโพเนนต์ฮาร์ดแวร์เดิมที่สร้างเสียงดังและไม่พึงประสงค์ อาจส่งผลเสียต่อ UX การสั่นด้วยการแสดงผลคุณภาพต่ำ (เช่น โทรศัพท์ราคาถูกที่เสียแล้ว)
ล้างการโต้ตอบการสัมผัส
การโต้ตอบการสัมผัสที่ชัดเจนรองรับความรู้สึกของการเปลี่ยนแปลงสถานะที่แยกกัน (เช่น การเปลี่ยนแปลงแบบไบนารีในระหว่างกระบวนการเปิดและปิดเครื่อง) เนื่องจากลักษณะของข้อบ่งชี้การใช้งานแบบแยก ระบบจึงสร้างการโต้ตอบการสัมผัสที่ชัดเจนเป็นเอนทิตีเดียว (เช่น เอฟเฟกต์การโต้ตอบการสัมผัส 1 รายการต่อเหตุการณ์อินพุต 1 รายการ)
Android มุ่งมั่นที่จะมอบการโต้ตอบการสัมผัสที่ชัดเจนพร้อมความรู้สึกที่หนักแน่นแต่คมชัด แทนที่จะเป็นความรู้สึกที่สั่นหรือนุ่มนวล
ค่าคงที่แบบสัมผัสที่กำหนดไว้ล่วงหน้าซึ่งสร้างขึ้นเพื่อรองรับการโต้ตอบการสัมผัสที่ชัดเจนประกอบด้วยองค์ประกอบต่อไปนี้
CLOCK_TICKCONFIRMCONTEXT_CLICKGESTURE_ENDGESTURE_STARTKEYBOARD_PRESSKEYBOARD_RELEASEKEYBOARD_TAPLONG_PRESSREJECTTEXT_HANDLE_MOVEVIRTUAL_KEYVIRTUAL_KEY_RELEASE
ใน
VibrationEffect:
EFFECT_CLICKEFFECT_DOUBLE_CLICKEFFECT_HEAVY_CLICKEFFECT_TICK
การสร้างความรู้ร่วมกันระหว่างผู้ผลิตอุปกรณ์และนักพัฒนาแอปเป็นกุญแจสำคัญในการ ยกระดับคุณภาพโดยรวมของการตอบสนองแบบสัมผัสในระบบนิเวศของ Android ใช้รายการตรวจสอบพื้นฐาน การประเมินฮาร์ดแวร์ และ CDD เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งใช้งานการตอบสนองแบบสัมผัส
รูปที่ 2 การกดและปล่อย
การโต้ตอบการสัมผัสที่สมบูรณ์
การโต้ตอบการสัมผัสที่สมบูรณ์เป็นหมวดหมู่การโต้ตอบการสัมผัสที่กำลังเติบโตซึ่งมีมากกว่าเอฟเฟกต์แบบอิงตามแรงกระตุ้นเดียว Android มุ่งมั่นที่จะรองรับการโต้ตอบการสัมผัสที่สมบูรณ์แบบด้วยความสามารถในการประกอบและปรับแต่งสูงพร้อมรายละเอียดในระดับที่ละเอียด Android 11 หรือต่ำกว่ารองรับกรณีการใช้งานต่อไปนี้
รูปที่ 3 การโต้ตอบการสัมผัสที่สมบูรณ์พร้อมพื้นผิวที่เลื่อนได้
รูปที่ 4 การลากและการปัด
กรณีการใช้งานที่ 1: การเลื่อนพื้นผิว
หากมีการทำซ้ำเอฟเฟกต์การสั่นขณะที่นิ้วเลื่อนเหนือพื้นผิวระบบสัมผัส (เช่น การลาก การปัด การสำรวจพื้นผิวด้วยพื้นผิวสัมผัสเสมือนจริง) เอฟเฟกต์การสั่นที่ทำซ้ำควรคมชัดและละเอียด
หากเอฟเฟกต์แต่ละรายการมีเสียงก้องมากกว่าเสียงคมชัด ระบบอาจลบช่วงเวลาระหว่างการทำซ้ำออก ผลลัพธ์คือเสียงหึ่งยาว 1 ครั้ง แทนที่จะเป็นสัญญาณแยกกันหลายครั้ง
หากแอมพลิจูดไม่ละเอียดพอ พลังงานสัมผัสที่รับรู้ได้จะเพิ่มขึ้น ผ่านการทำซ้ำ ส่งผลให้เกิดการสั่นที่แรงมากในตอนท้ายของ การทำซ้ำ
ใช้พื้นผิวสัมผัสบนพื้นผิวสำหรับท่าทางสัมผัสแบบปัดและลาก
ใช้ CLOCK_TICK และ TEXT_HANDLE_MOVE ใน HapticFeedbackConstants
ค่าคงที่เหล่านี้จะกำหนดลักษณะของการทำซ้ำและแอมพลิจูดไว้ล่วงหน้า
สร้างเอฟเฟกต์ของคุณเอง
หากต้องการสร้างเอฟเฟกต์ของคุณเอง ให้ออกแบบโดยการเชื่อมต่อลำดับของ PRIMITIVE_CLICK และ PRIMITIVE_TICK ใน VibrationEffect.Composition
คุณสามารถปรับลักษณะของการทำซ้ำและสเกลแอมพลิจูด
โดยใช้ addPrimitive(int primitiveID, float scale, int delay) การรองรับขึ้นอยู่กับความสามารถ CAP_COMPOSE_EFFECTS ของอินเทอร์เฟซ HAL ของ Vibrator
กรณีการใช้งานที่ 2: การสั่นยาวพร้อมเอฟเฟกต์ Ease-in
การสั่นยาวเป็นการสั่นแบบแอมพลิจูดที่ราบรื่นซึ่งเปลี่ยนจาก 0 เป็นแอมพลิจูดเป้าหมาย การสั่นแบบยาวจะสร้างการโต้ตอบการสัมผัสที่รับรู้ได้ซึ่งกระตุ้นความสนใจ อย่างไรก็ตาม การสั่นยาวอย่างกะทันหันอาจทำให้ผู้ใช้ตกใจในสภาพแวดล้อมที่เงียบ และมักจะทำให้เกิดเสียงหึ่งที่ได้ยิน หากต้องการสร้างการสั่นยาวที่ นุ่มนวลยิ่งขึ้น ให้ใช้เอฟเฟกต์ Ease In ที่จุดเริ่มต้นของการสั่นยาว ซึ่งจะทำให้การเปลี่ยนแอมพลิจูดเป็นไปอย่างราบรื่นและค่อยๆ เพิ่มขึ้นจนถึง แอมพลิจูดเป้าหมาย
ใช้เอฟเฟกต์ Ease In
ตรวจสอบความสามารถของฮาร์ดแวร์ในการควบคุมแอมพลิจูดด้วย
android.os.Vibrator.hasAmplitudeControl()- ผลลัพธ์ต้องเป็น
trueเพื่อสร้างเอฟเฟกต์ Ease In ที่มี แอมพลิจูดแตกต่างกัน
- ผลลัพธ์ต้องเป็น
ใช้
VibrationEffectcreateWaveform(timings[], amplitudes[], int repeat)ปรับชุดของ
timings[]และamplitudes[]เพื่อสร้างเส้นโค้ง ease-in ดังที่แสดงในรูปที่ 5
รูปที่ 5 เส้นโค้งการสั่นยาวแบบค่อยๆ เพิ่มความเร็ว
กรณีการใช้งานที่ 3: การโต้ตอบการสัมผัสที่เชื่อมต่อกับเสียง
การโต้ตอบการสัมผัสที่เชื่อมโยงกับเสียงคือรูปแบบการสั่นที่เชื่อมโยงกับจังหวะของเสียง เพื่อดึงดูดความสนใจของผู้ใช้
การสั่นแบบรู้สึกได้ที่เชื่อมต่อกับเสียง: ประโยชน์
หากต้องการใช้แฮปติกที่เชื่อมต่อกับเสียง ให้รวมแฮปติกที่ชัดเจนเข้ากับการสั่นสะเทือนที่ยาวนาน การสั่นที่หนักแน่นแต่สั้นจากการโต้ตอบการสัมผัสที่ชัดเจนจะสร้างรูปแบบจังหวะที่แยกกัน เมื่อใช้ร่วมกับระดับการกระตุ้นสูงที่การสั่นสะเทือนยาวมอบให้ การสั่นสะเทือนนี้จะดึงดูดความสนใจของผู้ใช้ได้เป็นอย่างดี
คุณควรพิจารณารูปแบบจังหวะของความรู้สึก หากไม่มีความรู้สึกถึงจังหวะ ผู้ใช้จะรับรู้ความรู้สึกแบบสัมผัสเป็นการสั่นแบบสุ่มและมีแนวโน้มที่จะเพิกเฉยต่อการสั่นเหล่านั้น
รูปที่ 6 ตัวอย่างการโต้ตอบการสัมผัสคู่เสียง
การโต้ตอบการสัมผัสที่เชื่อมต่อกับเสียง: เคล็ดลับในการติดตั้งใช้งาน
การติดตั้งใช้งานการสัมผัสที่เชื่อมโยงกับเสียงต้องมีความเข้าใจพื้นฐานเกี่ยวกับการเล่นเนื้อหา ทั้งช่องเสียงและการสัมผัส โปรดคำนึงถึงสิ่งต่อไปนี้
ใช้คลาส
MediaPlayerหรือSoundPool- เนื้อหาในรูปแบบ OGG ที่มีคีย์ข้อมูลเมตาพิเศษ
(
ANDROID_HAPTICตามด้วยจำนวนช่องสัมผัส) จะระบุ การมีอยู่ของข้อมูลสัมผัสและการเล่นด้วยMediaPlayerและSoundPool
- เนื้อหาในรูปแบบ OGG ที่มีคีย์ข้อมูลเมตาพิเศษ
(
ระบุการรองรับการโต้ตอบการสัมผัสและการเล่นเสียงใน
audio_policy_configuration.xml- ใช้โปรไฟล์เอาต์พุตที่มีช่องการโต้ตอบการสัมผัส
AUDIO_CHANNEL_OUT_HAPTIC_A|B - สำหรับสตรีมเอาต์พุตที่มีช่องสัมผัส โปรดทราบว่าช่องสัมผัส จะแสดงเป็นช่องพิเศษในข้อมูล
ตัวอย่าง
หากมาสก์ช่องสำหรับสตรีมเอาต์พุตมีลักษณะดังนี้
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_Aจากนั้นตัวอย่างทั้งหมดควรมีลักษณะดังนี้
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A- ใช้โปรไฟล์เอาต์พุตที่มีช่องการโต้ตอบการสัมผัส
เปลี่ยน
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)เป็นfalseเพื่อเล่นช่องการสั่น- โดยค่าเริ่มต้น ระบบจะปิดเสียงแชแนลการสั่น (
true) - กรณีการใช้งาน ได้แก่ เสียงเรียกเข้าและเสียง UI ที่มี การสั่นและฟีดแบ็กแบบซิงโครนัส
- โดยค่าเริ่มต้น ระบบจะปิดเสียงแชแนลการสั่น (
HAL ของเครื่องสั่นต้องรองรับการควบคุมภายนอก
- สำหรับการใช้งาน HIDL ให้ใช้
setExternalControl(bool enabled) generates (Status status) - สำหรับการติดตั้งใช้งาน AIDL ให้ใช้
void setExternalControl(in boolean enabled)
- สำหรับการใช้งาน HIDL ให้ใช้
รูปที่ 7 การใช้การโต้ตอบการสัมผัสที่เชื่อมต่อกับเสียง
การโต้ตอบการสัมผัสที่เชื่อมต่อกับเสียง: HapticGenerator
HapticGenerator คือเอฟเฟกต์เสียงที่เปิดตัวใน Android 12 ซึ่ง
สร้างข้อมูลการสัมผัสจากช่องเสียงและเล่นแบบเรียลไทม์เป็นการสัมผัสที่เชื่อมโยงกับเสียงได้ ระบบจะใช้เอฟเฟกต์กับ AudioTrack ตามที่แสดงในรูปที่ 8 ดังนี้

รูปที่ 8 สถาปัตยกรรม Haptic Generator
ภาพการแสดงสถาปัตยกรรมนี้แสดงให้เห็นว่ามีการใช้ Haptic Generator กับสตรีมเสียงของผู้ใช้ที่เข้ามาที่ใด
ก่อนที่จะส่งไปยัง Audio HAL ระบบจะใช้เครื่องกำเนิด
หลังจากที่ AudioMixer แยกข้อมูลเสียงและข้อมูลการสัมผัส และก่อนที่จะใช้เอฟเฟกต์เสียงอื่นๆ
และเอาต์พุตของเครื่องกำเนิดจะลบล้างข้อมูลการสัมผัสก่อนหน้าในสตรีม
หากต้องการให้มั่นใจว่าอัลกอริทึมตัวสร้างการสั่นจะสร้างการสั่นคุณภาพสูง ให้ปรับอัลกอริทึมการสร้างให้เข้ากับมอเตอร์สั่นของอุปกรณ์โดยการปรับ พารามิเตอร์ที่กำหนดค่าเชนของตัวกรองที่ใช้กับรูปคลื่นเสียง ส่วนนี้จะอธิบายพารามิเตอร์เหล่านี้โดยละเอียด และอธิบายวิธีปรับแต่งพารามิเตอร์ให้ตรงกับข้อกำหนดของฮาร์ดแวร์
ความถี่เรโซแนนซ์สำหรับตัวกรองแถบความถี่ผ่าน
ความถี่เรโซแนนซ์ของไวเบรเตอร์คือความถี่ที่แอคทูเอเตอร์แบบสัมผัส มีเอาต์พุตสูงสุด พารามิเตอร์นี้จะปรับตัวต้านเรโซเนเตอร์เพื่อทำให้ฟังก์ชันการโอนการตอบสนองแบนราบบางส่วน เพื่อให้ได้แบนด์วิดท์ที่กว้างขึ้น เฟรมเวิร์ก Android จะลิงก์ค่านี้กับเอาต์พุตของเมธอด HAL ของ Vibrator
IVibrator.getResonantFrequencyโดยอัตโนมัติค่าเริ่มต้นของพารามิเตอร์นี้คือ 150 Hz คุณแก้ไขค่านี้ได้ในโค้ด
กำลังการปรับให้เป็นมาตรฐานสำหรับเอนเวโลปแบบช้า
พารามิเตอร์นี้กำหนดเลขชี้กำลังในการปรับค่าให้เป็นมาตรฐานบางส่วน (การควบคุมอัตราขยายอัตโนมัติ) ค่าเริ่มต้นคือ -0.8 ซึ่งหมายความว่า ขั้นตอนนี้จะนำความผันผวนของช่วงไดนามิกออก 80% คุณแก้ไขได้ในโค้ด
ค่า Q สำหรับตัวกรองแถบหยุด
ปัจจัยคุณภาพของเครื่องสั่น (ปัจจัย Q) จะกำหนดโดยพารามิเตอร์ 2 รายการต่อไปนี้
Zero Q คือปัจจัยด้านคุณภาพของศูนย์ในตัวกรองแถบหยุดที่ ยกเลิกเรโซแนนซ์บางส่วน
Pole Q ซึ่งเป็นปัจจัยด้านคุณภาพของขั้วในตัวกรองแถบหยุด
อัตราส่วนของค่าทั้ง 2 นี้จะจำกัดการระงับเรโซแนนซ์ เพื่อเพิ่มความถี่ต่ำและขยายการตอบสนองของอัลกอริทึม ตัวอย่างเช่น ค่าเริ่มต้นของ 8 สำหรับ Q ที่เป็น 0 และ 4 สำหรับ Q ที่เป็นเสาจะทำให้เกิด อัตราส่วน 2 ซึ่งจำกัดการระงับเรโซแนนซ์ด้วยปัจจัย 2 (6 dB) เฟรมเวิร์ก Android จะลิงก์ค่าทั้ง 2 ค่ากับเอาต์พุตของเมธอด HAL ของ Vibrator
IVibrator.getQFactorหากค่าเริ่มต้นไม่ได้คำนึงถึงการลดความแรงของมอเตอร์ ในอุปกรณ์ เราขอแนะนำให้แก้ไขทั้ง 2 ค่าพร้อมกัน และ เพิ่มหรือลดทั้ง 2 ค่า อัตราส่วนของ Q ที่ 0 ต่อ Q ที่ขั้ว ควรมากกว่า 1 คุณแก้ไขได้ในโค้ด
ความถี่คัตออฟสำหรับการบิดเบี้ยว
ความถี่มุมจะใช้โดยตัวกรองแบบผ่านต่ำที่ระงับ การสั่นสะเทือนระดับต่ำและเพิ่มระดับที่สูงขึ้นโดยใช้การบิดเบือนแบบลูกบาศก์ ค่าเริ่มต้นคือ 300 Hz คุณแก้ไขค่านี้ได้ในโค้ด
เกนอินพุตและเกณฑ์ลูกบาศก์สำหรับการบิดเบือน
พารามิเตอร์เหล่านี้ใช้โดยตัวกรองการบิดเบือนแบบไม่เชิงเส้นซึ่งใช้กับ รูปคลื่นอินพุตที่ลดทอนแอมพลิจูดของสัญญาณความถี่ต่ำและ เพิ่มแอมพลิจูดของสัญญาณความถี่สูง
- ค่าเริ่มต้นสำหรับปัจจัยการเพิ่มอินพุตคือ 0.3
- ค่าเริ่มต้นสำหรับเกณฑ์ลูกบาศก์คือ 0.1
เราขอแนะนําให้แก้ไขทั้ง 2 ค่าพร้อมกัน โดยจะอยู่ในโค้ด
ดูข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันที่ใช้โดยตัวกรองนี้ได้ที่การติดตั้งใช้งานในโค้ด
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่พารามิเตอร์ทั้ง 2 รายการนี้มีอิทธิพลต่อเอาต์พุต เราขอแนะนำให้พล็อตการตอบสนองความถี่ของตัวกรองและสังเกตว่าการตอบสนองความถี่เปลี่ยนแปลงไปอย่างไรเมื่อค่าพารามิเตอร์แตกต่างกัน
การเพิ่มเอาต์พุตสำหรับการบิดเบือน
พารามิเตอร์นี้ควบคุมแอมพลิจูดการสั่นสะเทือนสุดท้าย เป็นเกนสุดท้าย ที่ใช้หลังจากลิมิตเตอร์แบบอ่อนซึ่งจำกัดแอมพลิจูดการสั่นให้ น้อยกว่า 1 ค่าเริ่มต้นคือ 1.5 และคุณแก้ไขค่านี้ได้ในโค้ด
หากการสั่นเบาเกินไป ให้เพิ่มค่า หากได้ยินเสียง ฮาร์ดแวร์แอคทูเอเตอร์สั่น ให้ลดค่า