การปรับปรุงเฟรมเวิร์ก Android ทั้งหมดที่สร้างขึ้นโดยใช้ระบบสัมผัสนั้นขับเคลื่อนโดยชุดหลักการ UX ที่พัฒนาในอัตราที่เท่ากัน หลักการปัจจุบันเกี่ยวข้องกับการแทนที่ การสั่นแบบ Buzzy ด้วย ระบบสัมผัสที่ชัดเจน และการสำรวจ ระบบสัมผัสที่หลากหลาย
รูปที่ 1 หลักการปัจจุบัน
ตารางต่อไปนี้แสดงรายการ Haptics API ที่มีอยู่ทั้งหมด
เอพีไอ | วิธีการ | ปีเพิ่ม |
---|---|---|
android.view.HapticFeedbackConstants |
| ก่อนปี 2559 |
| 2017 (แอนดรอยด์ 8) | |
| 2020 (แอนดรอยด์ 11) | |
หุ่นยนต์ดู |
| ก่อนปี 2559 |
android.os.สั่น |
| ก่อนปี 2559 |
| 2017 (แอนดรอยด์ 8) | |
| 2020 (แอนดรอยด์ 11) | |
android.os.เอฟเฟกต์การสั่นสะเทือน |
| 2017 (แอนดรอยด์ 8) |
| 2019 (แอนดรอยด์ 10) | |
android.os.VibrationEffect.องค์ประกอบ |
| 2020 (แอนดรอยด์ 11) |
android.media.AudioAttributes.Builder |
| 2019 (แอนดรอยด์ 10) |
การสั่นสะเทือนที่ฉวัดเฉวียน
ย้อนกลับไปในเพจเจอร์และฟีเจอร์โฟน การสั่นสะเทือน แบบออด ERM ที่มีคุณภาพต่ำแต่ประหยัดพลังงานได้ถูกนำมาใช้แทนเสียงเรียกเข้าใน โหมดเงียบ ส่วนประกอบฮาร์ดแวร์แบบเดิมที่สร้างเสียงรบกวนที่ดังและไม่พึงประสงค์อาจเป็นอันตรายต่อ UX ระบบสัมผัสได้ โดยการแสดงผลคุณภาพต่ำ (เช่น โทรศัพท์ราคาถูกและเสีย)
ระบบสัมผัสที่ชัดเจน
ระบบสัมผัสที่ชัดเจน รองรับความรู้สึกของการเปลี่ยนแปลงสถานะ ที่ไม่ต่อเนื่อง (เช่น การเปลี่ยนแปลงไบนารีระหว่างกระบวนการเปิด/ปิดเครื่อง) เนื่องจากลักษณะของการจ่าย แบบแยกส่วน ระบบสัมผัสที่ชัดเจนจึงถูกสร้างขึ้นเป็นเอนทิตีเดียว (เช่น หนึ่งเอฟเฟกต์ระบบสัมผัสต่อหนึ่งเหตุการณ์อินพุต)
Android มุ่งหวังที่จะส่งมอบระบบสัมผัสที่ชัดเจนพร้อมสัมผัสที่หนักแน่นแต่เฉียบคม มากกว่าความรู้สึกที่ส่งเสียงครวญครางหรือเละเทะ
ค่าคงที่ระบบสัมผัสที่กำหนดไว้ล่วงหน้าซึ่งสร้างขึ้นเพื่อรองรับระบบสัมผัสที่ชัดเจนมีดังต่อไปนี้
-
CLOCK_TICK
-
CONFIRM
-
CONTEXT_CLICK
-
GESTURE_END
-
GESTURE_START
-
KEYBOARD_PRESS
-
KEYBOARD_RELEASE
-
KEYBOARD_TAP
-
LONG_PRESS
-
REJECT
-
TEXT_HANDLE_MOVE
-
VIRTUAL_KEY
-
VIRTUAL_KEY_RELEASE
ใน VibrationEffect
:
-
EFFECT_CLICK
-
EFFECT_DOUBLE_CLICK
-
EFFECT_HEAVY_CLICK
-
EFFECT_TICK
การสร้างความรู้ทั่วไประหว่างผู้ผลิตอุปกรณ์และนักพัฒนาเป็นกุญแจสำคัญในการเพิ่มคุณภาพโดยรวมของระบบสัมผัสในระบบนิเวศของ Android ใช้ รายการตรวจสอบพื้นฐาน การประเมินฮาร์ดแวร์ และ CDD เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการใช้งานระบบสัมผัส
รูปที่ 3 การกดและปล่อย
ระบบสัมผัสที่หลากหลาย
ระบบสัมผัสหน้าจอแบบสมบูรณ์ เป็นหมวดหมู่ระบบสัมผัสหน้าจอที่กำลังเติบโต ซึ่งนอกเหนือไปจากเอฟเฟกต์แบบแรงกระตุ้นเดี่ยว Android มุ่งหวังที่จะสนับสนุนระบบสัมผัสที่หลากหลายด้วยความสามารถในการเขียนและการปรับเปลี่ยนได้สูงพร้อมรายละเอียดในระดับที่ละเอียด กรณีการใช้งานต่อไปนี้รองรับใน Android 11 หรือต่ำกว่า
รูปที่ 4 ระบบสัมผัสที่หลากหลายพร้อมพื้นผิวแบบเลื่อน
รูปที่ 5 การลากและการปัดนิ้ว
ใช้กรณีที่ 1: พื้นผิวแบบเลื่อน
หากเอฟเฟกต์ระบบสั่นเกิดขึ้นซ้ำในขณะที่นิ้วเลื่อนไปบนพื้นผิวระบบสัมผัส (เช่น การลาก การปัด และการสำรวจพื้นผิวด้วยพื้นผิวระบบสั่นแบบ Phantom) เอฟเฟกต์ระบบสั่นแบบสัมผัสซ้ำ ๆ จะดีกว่าที่คมชัดและละเอียดอ่อน
หากเอฟเฟ็กต์แต่ละรายการมีความคึกคักมากกว่าจะคมชัด ช่วงเวลาระหว่างการทำซ้ำก็มีแนวโน้มที่จะถูกลบออกไป ผลลัพธ์ที่ได้คือเสียงกระหึ่มยาวเพียงครั้งเดียว แทนที่จะเป็นสัญญาณแยกหลายสัญญาณ
หากแอมพลิจูดไม่ละเอียดพอ พลังงานสัมผัสที่รับรู้จะถูกสร้างขึ้นผ่านการทำซ้ำ ส่งผลให้เกิดการสั่นที่รุนแรงอย่างล้นหลามเมื่อสิ้นสุดการทำซ้ำ
ใช้พื้นผิวแบบสัมผัสที่เรียบง่ายสำหรับการปัดและลากท่าทาง
ใช้ CLOCK_TICK
และ TEXT_HANDLE_MOVE
ใน HapticFeedbackConstants
ค่าคงที่เหล่านี้จะกำหนดคุณลักษณะของการทำซ้ำและแอมพลิจูดไว้ล่วงหน้า
สร้างเอฟเฟกต์ของคุณเอง
หากต้องการสร้างเอฟเฟกต์ของคุณเอง ให้เขียนการออกแบบโดยเชื่อมโยงลำดับของ PRIMITIVE_CLICK
และ PRIMITIVE_TICK
เข้าด้วยกันใน VibrationEffect.Composition
คุณสามารถปรับลักษณะของการทำซ้ำและมาตราส่วนแอมพลิจูดได้โดยใช้ addPrimitive(int primitiveID, float scale, int delay)
การสนับสนุนอาศัยความสามารถ CAP_COMPOSE_EFFECTS
ของ อินเทอร์เฟซ Vibrator HAL
ใช้กรณีที่ 2: การสั่นสะเทือนที่ยาวนานและง่ายดาย
การสั่นสะเทือนแบบยาวคือการสั่นแบบแอมพลิจูดที่ราบรื่นซึ่งจะเปลี่ยนจาก 0 เป็นแอมพลิจูดเป้าหมาย การสั่นสะเทือนที่ยาวนานสามารถสร้างระบบสัมผัสที่ตั้งใจที่รับรู้ได้ง่าย อย่างไรก็ตาม การสั่นสะเทือนที่ยาวนานอย่างกะทันหันอาจทำให้ผู้ใช้ตกใจในสภาพแวดล้อมที่เงียบสงบ และมักจะทำให้เกิดเสียงหึ่งๆ หากต้องการสร้างการสั่นสะเทือนที่ยาวนานยิ่งขึ้น ให้ใช้เอฟเฟกต์การผ่อนผันที่จุดเริ่มต้นของการสั่นสะเทือนระยะยาว สิ่งนี้ทำให้เกิดการเปลี่ยนแปลงแอมพลิจูดที่ราบรื่นซึ่งสร้างไปสู่แอมพลิจูดเป้าหมาย
ใช้เอฟเฟ็กต์การค่อยๆ เปลี่ยน
ตรวจสอบความสามารถของฮาร์ดแวร์ในการควบคุมแอมพลิจูดด้วย
android.os.Vibrator.hasAmplitudeControl()
- ผลลัพธ์จะต้องเป็น
true
เพื่อสร้างเอฟเฟ็กต์ที่ผ่อนคลายด้วยแอมพลิจูดที่แตกต่างกัน
- ผลลัพธ์จะต้องเป็น
ใช้
VibrationEffect
createWaveform(timings[], amplitudes[], int repeat)
ปรับอนุกรมของ
timings[]
และamplitudes[]
เพื่อสร้างเส้นโค้งความง่ายในการเข้า ดังแสดงในรูปที่ 6
รูปที่ 6 เส้นโค้งความง่ายในการสั่นแบบยาว
ใช้กรณีที่ 3: ระบบสัมผัสควบคู่กับเสียง
การสัมผัสควบคู่กับเสียง คือรูปแบบการสัมผัสควบคู่กับจังหวะของเสียงเพื่อดึงดูดความสนใจของผู้ใช้
ระบบสัมผัสด้วยเสียงควบคู่กับเสียง: ประโยชน์
หากต้องการใช้ระบบสัมผัสที่ควบคู่กับเสียง ให้รวมระบบสัมผัสที่ชัดเจนเข้ากับการสั่นแบบยาว ความรู้สึกสัมผัสที่แรงแต่สั้นจากระบบสัมผัสที่ชัดเจนทำให้เกิดรูปแบบจังหวะที่แยกจากกัน เมื่อรวมกับสิ่งเร้าในระดับสูงที่การสั่นสะเทือนเป็นเวลานานจะดึงดูดความสนใจของผู้ใช้ได้ดีมาก
การพิจารณารูปแบบจังหวะของความรู้สึกเป็นสิ่งสำคัญ หากไม่มีสัมผัสของจังหวะ ผู้ใช้จะรับรู้ถึงความรู้สึกของระบบสัมผัสว่าเป็นเสียงพึมพำแบบสุ่ม และมีแนวโน้มที่จะเพิกเฉยต่อความรู้สึกเหล่านั้น
รูปที่ 7 ตัวอย่างระบบสัมผัสเสียงคู่
ระบบสัมผัสด้วยเสียงควบคู่กับเสียง: เคล็ดลับในการนำไปใช้
การใช้ระบบสัมผัสแบบจับคู่เสียงจำเป็นต้องมีความเข้าใจพื้นฐานเกี่ยวกับการเล่นเนื้อหาของทั้งช่องเสียงและช่องสัมผัส โปรดคำนึงถึงสิ่งต่อไปนี้
ใช้คลาส
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 ให้ใช้
รูปที่ 8 การใช้ระบบสัมผัสเสียงควบคู่กัน
ระบบสัมผัสแบบสัมผัสควบคู่กับเสียง: เครื่องสร้างระบบสัมผัสแบบสัมผัส
HapticGenerator
เป็น เอฟเฟกต์เสียง ที่เปิดตัวใน Android 12 ที่สามารถสร้างข้อมูลระบบสัมผัสจากช่องเสียงและเล่นแบบเรียลไทม์ในรูปแบบ ระบบสั่นควบคู่กับเสียง เอฟเฟ็กต์จะถูกนำไปใช้กับ AudioTrack
ตามที่อธิบายไว้ในรูปที่ 9
รูปที่ 9 สถาปัตยกรรมตัวสร้างแบบสัมผัส
เพื่อให้แน่ใจว่าอัลกอริธึมตัวสร้างแฮปติคของคุณสร้างแฮปติคคุณภาพสูง ให้ปรับแต่งอัลกอริธึมการสร้างให้กับมอเตอร์สั่นของอุปกรณ์โดยการปรับพารามิเตอร์ที่กำหนดค่าสายของตัวกรองที่ใช้กับรูปคลื่นเสียง ส่วนนี้จะอธิบายพารามิเตอร์เหล่านี้โดยละเอียด และอธิบายวิธีปรับแต่งให้เข้ากับข้อกำหนดฮาร์ดแวร์ของคุณ
ความถี่เรโซแนนซ์สำหรับตัวกรองแบนด์พาส
ความถี่เรโซแนนซ์ของเครื่องสั่นคือความถี่ที่แอคชูเอเตอร์ระบบสัมผัสมีเอาต์พุตสูงสุด พารามิเตอร์นี้จะปรับตัวป้องกันเสียงสะท้อนเพื่อทำให้ฟังก์ชันการถ่ายโอนการตอบสนองเรียบลงบางส่วน เพื่อให้ได้แบนด์วิดท์ที่กว้างขึ้น เฟรมเวิร์ก Android เชื่อมโยงค่านี้กับเอาต์พุตของเมธอด Vibrator HAL
IVibrator.getResonantFrequency
โดยอัตโนมัติค่าเริ่มต้นสำหรับพารามิเตอร์นี้คือ 150Hz ซึ่งสามารถแก้ไขได้ในรหัส ที่นี่
พลังการทำให้เป็นมาตรฐานสำหรับซองจดหมายที่ช้า
พารามิเตอร์นี้กำหนดเลขชี้กำลังในการทำให้เป็นมาตรฐานบางส่วน (การควบคุมอัตราขยายอัตโนมัติ) ค่าเริ่มต้นคือ -0.8 ซึ่งหมายความว่า 80% ของการเปลี่ยนแปลงช่วงไดนามิกจะถูกลบออกโดยขั้นตอนการควบคุมอัตราขยายนี้ ซึ่งสามารถแก้ไขได้ในรหัส ที่นี่
ปัจจัย Q สำหรับตัวกรองแบนด์สต็อป
ปัจจัยด้านคุณภาพเครื่องสั่น (ปัจจัย Q) ถูกกำหนดโดยพารามิเตอร์สองตัว:
Zero Q คือปัจจัยด้านคุณภาพของค่าศูนย์ในตัวกรองแบนด์สต็อปที่จะยกเลิกเสียงสะท้อนบางส่วน
เสา Q ซึ่งเป็นปัจจัยด้านคุณภาพของเสาในตัวกรองแถบหยุด
อัตราส่วนของค่าทั้งสองนี้จะจำกัดการปราบปรามของเสียงสะท้อน เพื่อเพิ่มความถี่ที่ต่ำกว่าและขยายการตอบสนองของอัลกอริทึมให้กว้างขึ้น ตัวอย่างเช่น ค่าเริ่มต้น 8 สำหรับ Zero Q และ 4 สำหรับ Pole Q จะสร้างอัตราส่วน 2 ซึ่งจำกัดการลดเสียงสะท้อนด้วยปัจจัย 2 (6 dB) เฟรมเวิร์ก Android เชื่อมโยงทั้งสองค่ากับเอาต์พุตของเมธอด Vibrator HAL
IVibrator.getQFactor
หากค่าเริ่มต้นไม่ได้คำนึงถึงการลดกำลังของมอเตอร์ในอุปกรณ์ของคุณ เราขอแนะนำให้แก้ไขทั้งสองค่าพร้อมกัน และเพิ่มทั้งสองค่าหรือลดทั้งสองค่า อัตราส่วนของ Zero Q ต่อ Pole Q ควรมากกว่า 1 ซึ่งสามารถแก้ไขได้ในรหัส ที่นี่
ความถี่มุมสำหรับการบิดเบือน
ความถี่มุมถูกใช้โดยฟิลเตอร์ความถี่ต่ำผ่านซึ่งจะระงับการสั่นสะเทือนในระดับต่ำและเพิ่มระดับที่สูงขึ้นโดยใช้การบิดเบือนลูกบาศก์ โดยมีค่าเริ่มต้นอยู่ที่ 300Hz ซึ่งสามารถแก้ไขได้ในรหัส ที่นี่
อัตราขยายอินพุตและเกณฑ์คิวบ์สำหรับการบิดเบือน
พารามิเตอร์เหล่านี้ถูกใช้โดยตัวกรองความผิดเพี้ยนแบบไม่เชิงเส้นที่ใช้กับรูปคลื่นอินพุตซึ่งจะช่วยลดความกว้างของสัญญาณความถี่ต่ำและเพิ่มความถี่ที่สูงกว่า
- ค่าเริ่มต้นสำหรับปัจจัยการรับอินพุตคือ 0.3
- ค่าดีฟอลต์สำหรับขีดจำกัดคิวบ์คือ 0.1
เราขอแนะนำให้แก้ไขทั้งสองค่าพร้อมกัน สามารถพบได้ในรหัส ที่นี่
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันที่ใช้โดยตัวกรองนี้ โปรดดูการใช้งาน ที่นี่ หากต้องการเรียนรู้เพิ่มเติมว่าพารามิเตอร์ทั้งสองนี้ส่งผลต่อเอาต์พุตอย่างไร เราขอแนะนำให้วางแผนการตอบสนองความถี่ของตัวกรอง และสังเกตว่าการตอบสนองความถี่เปลี่ยนแปลงไปอย่างไรด้วยค่าพารามิเตอร์ที่แตกต่างกัน
อัตราขยายเอาต์พุตสำหรับการบิดเบือน
พารามิเตอร์นี้ควบคุมแอมพลิจูดของการสั่นสุดท้าย มันเป็นเกนสุดท้ายที่ใช้หลังจากซอฟต์ลิมิตเตอร์ที่จำกัดแอมพลิจูดการสั่นสะเทือนให้น้อยกว่า 1 ค่าเริ่มต้นคือ 1.5 และสามารถแก้ไขได้ในโค้ด ที่นี่ หากการสั่นสะเทือนเบาเกินไป ให้เพิ่มค่า หากคุณได้ยินเสียงฮาร์ดแวร์ของแอคชูเอเตอร์ส่งเสียงดัง ให้ลดค่าลง