การปรับปรุงเฟรมเวิร์กของ Android ทั้งหมดที่สร้างขึ้นจากระบบสัมผัสนั้นขับเคลื่อนโดยชุดของหลักการ UX ที่มีการพัฒนาในอัตราที่เท่าเทียมกัน หลักการปัจจุบันเกี่ยวข้องกับการแทนที่ การสั่นที่ดังมากด้วยการสั่นแบบ ชัดเจน และการสำรวจการสั่นแบบ สมบูรณ์
รูปที่ 1 หลักการปัจจุบัน
ตารางต่อไปนี้แสดงรายการแฮปติก API ที่มีอยู่ทั้งหมด
API | วิธีการ | ปีที่เพิ่ม |
---|---|---|
android.view.HapticFeedbackConstants |
| ก่อนปี 2559 |
| 2017 (แอนดรอยด์ 8) | |
| 2020 (แอนดรอยด์ 11) | |
android.View |
| ก่อนปี 2559 |
android.os.Vibrator |
| ก่อนปี 2559 |
| 2017 (แอนดรอยด์ 8) | |
| 2020 (แอนดรอยด์ 11) | |
android.os.VibrationEffect |
| 2017 (แอนดรอยด์ 8) |
| 2019 (แอนดรอยด์ 10) | |
android.os.VibrationEffect.Composition |
| 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 การกดและปล่อย
ริช แฮปติกส์
Rich haptics เป็นหมวดหมู่ของ Haptics ที่เพิ่มขึ้นซึ่งมากกว่าเอฟเฟกต์แบบอิงแรงกระตุ้นเดี่ยว Android มุ่งหวังที่จะสนับสนุนการสั่นแบบสัมผัสที่สมบูรณ์พร้อมความสามารถในการปรับแต่งและปรับแต่งได้สูงพร้อมความละเอียดที่ละเอียด กรณีการใช้งานต่อไปนี้รองรับใน Android 11 หรือต่ำกว่า
รูปที่ 4 แฮปติกแบบสมบูรณ์พร้อมพื้นผิวแบบเลื่อน
รูปที่ 5. การลากและปัด
ใช้กรณีที่ 1: พื้นผิวเลื่อน
หากเอฟเฟกต์สัมผัสซ้ำในขณะที่นิ้วเลื่อนไปบนพื้นผิวระบบสัมผัส (เช่น การลาก การปัด การสำรวจพื้นผิวด้วยพื้นผิวสัมผัสแบบแฝง) เอฟเฟกต์สัมผัสแบบสัมผัสซ้ำนั้นควรคมชัดและละเอียดอ่อน
หากเอฟเฟกต์แต่ละรายการมีความคึกคักมากกว่าคมชัด ช่วงเวลาระหว่างการทำซ้ำมักจะหมดไป ผลที่ได้คือเสียงกระหึ่มยาวหนึ่งครั้งแทนที่จะเป็นสัญญาณที่ไม่ต่อเนื่องหลายสัญญาณ
หากแอมพลิจูดไม่ละเอียดเพียงพอ พลังงานสัมผัสที่รับรู้จะเพิ่มขึ้นจากการทำซ้ำ ส่งผลให้มีการสั่นอย่างรุนแรงเมื่อสิ้นสุดการทำซ้ำ
การใช้พื้นผิวสัมผัสที่เรียบง่ายสำหรับการปัดและลากท่าทาง
ใช้ CLOCK_TICK
และ TEXT_HANDLE_MOVE
ใน HapticFeedbackConstants
ค่าคงที่เหล่านี้กำหนดลักษณะของการทำซ้ำและแอมพลิจูดไว้ล่วงหน้า
สร้างเอฟเฟกต์ของคุณเอง
ในการสร้างเอฟเฟกต์ของคุณเอง ให้เขียนการออกแบบโดยการรวมลำดับของ PRIMITIVE_CLICK
และ PRIMITIVE_TICK
เข้าด้วยกันใน VibrationEffect.Composition
คุณสามารถปรับลักษณะของการทำซ้ำและมาตราส่วนแอมพลิจูดได้โดยใช้ addPrimitive(int primitiveID, float scale, int delay)
การสนับสนุนอาศัยความสามารถ CAP_COMPOSE_EFFECTS
ของ Vibrator HAL Interface
ใช้กรณี 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 การนำ Haptics ที่เชื่อมต่อเสียงมาใช้
แฮบติคแบบจับคู่เสียง: Haptic Generator
HapticGenerator
เป็น เอฟเฟกต์เสียง ที่เปิดตัวใน Android 12 ที่สามารถสร้างข้อมูลแบบสัมผัสจากช่องสัญญาณเสียงและเล่นแบบเรียลไทม์ในรูปแบบแฮบติคที่เชื่อมต่อ เสียง เอฟเฟกต์ถูกนำไปใช้กับ AudioTrack
ตามที่อธิบายไว้ในรูปที่ 9
รูปที่ 9 สถาปัตยกรรม Haptic Generator
เพื่อให้แน่ใจว่าอัลกอริธึมเครื่องกำเนิดแฮบติคของคุณสร้างแฮบติคคุณภาพสูง ให้ปรับอัลกอริธึมการสร้างให้เข้ากับมอเตอร์สั่นของอุปกรณ์โดยการปรับพารามิเตอร์ที่กำหนดค่าห่วงโซ่ของตัวกรองที่ใช้กับรูปคลื่นเสียง ส่วนนี้จะอธิบายพารามิเตอร์เหล่านี้โดยละเอียด และอธิบายวิธีปรับแต่งพารามิเตอร์เหล่านี้ให้สอดคล้องกับข้อกำหนดฮาร์ดแวร์ของคุณ
ความถี่เรโซแนนซ์สำหรับตัวกรองแบนด์พาส
ความถี่เรโซแนนซ์ของเครื่องสั่นคือความถี่ที่ตัวกระตุ้นแบบสัมผัสมีเอาต์พุตสูงสุด พารามิเตอร์นี้ปรับ anti-resonator เพื่อทำให้ฟังก์ชันการถ่ายโอนการตอบสนองบางส่วนแบนลง เพื่อให้ได้แบนด์วิดท์ที่กว้างขึ้น กรอบงาน Android จะเชื่อมโยงค่านี้กับผลลัพธ์ของวิธีการสั่น HAL โดย
IVibrator.getResonantFrequency
ค่าเริ่มต้นสำหรับพารามิเตอร์นี้คือ 150Hz ซึ่งสามารถแก้ไขได้ในรหัส ที่นี่
พลังการทำให้เป็นมาตรฐานสำหรับซองจดหมายที่ช้า
พารามิเตอร์นี้กำหนดเลขชี้กำลังในการทำให้เป็นมาตรฐานบางส่วน (การควบคุมอัตราขยายอัตโนมัติ) ค่าเริ่มต้นคือ -0.8 ซึ่งหมายความว่า 80% ของการเปลี่ยนแปลงช่วงไดนามิกจะถูกลบออกโดยขั้นตอนการควบคุมการเพิ่มนี้ ซึ่งสามารถแก้ไขได้ในรหัส ที่นี่
ปัจจัย Q สำหรับตัวกรองแบนด์สต็อป
ปัจจัยคุณภาพเครื่องสั่น (ปัจจัย Q) ถูกกำหนดโดยสองพารามิเตอร์:
Zero Q ซึ่งเป็นปัจจัยด้านคุณภาพของศูนย์ในตัวกรองแบบแบนด์สต็อปที่ตัดเสียงสะท้อนบางส่วน
The Pole Q ปัจจัยด้านคุณภาพของเสาในตัวกรองแบบ band-stop
อัตราส่วนของค่าทั้งสองนี้จะจำกัดการปราบปรามของเรโซแนนซ์เพื่อเพิ่มความถี่ต่ำและขยายการตอบสนองของอัลกอริธึม ตัวอย่างเช่น ค่าเริ่มต้นของ 8 สำหรับ Zero Q และ 4 สำหรับ Pole Q จะสร้างอัตราส่วน 2 ซึ่งจำกัดการปราบปรามการสั่นพ้องด้วยปัจจัย 2 (6 dB) กรอบงาน Android เชื่อมโยงทั้งสองค่ากับผลลัพธ์ของวิธีการสั่น HAL
IVibrator.getQFactor
หากค่าเริ่มต้นไม่ได้คำนึงถึงการหน่วงของความแรงของมอเตอร์ในอุปกรณ์ของคุณ เราแนะนำให้แก้ไขทั้งสองค่าพร้อมกัน และเพิ่มทั้งสองค่าหรือลดทั้งสองค่า อัตราส่วนของ Zero Q ต่อ Pole Q ควรมากกว่า 1 ซึ่งสามารถแก้ไขได้ในรหัส ที่นี่
ความถี่มุมสำหรับการบิดเบือน
ความถี่ของมุมใช้โดยตัวกรองความถี่ต่ำผ่านที่ระงับการสั่นระดับต่ำและเพิ่มระดับที่สูงขึ้นโดยใช้การบิดเบือนลูกบาศก์ ค่าเริ่มต้นคือ 300Hz ซึ่งสามารถแก้ไขได้ในรหัส ที่นี่
อินพุตเกนและเกณฑ์คิวบ์สำหรับการบิดเบือน
พารามิเตอร์เหล่านี้ใช้โดยตัวกรองความผิดเพี้ยนแบบไม่เชิงเส้นที่ใช้กับรูปคลื่นอินพุตที่ลดแอมพลิจูดของสัญญาณความถี่ต่ำและเพิ่มความถี่ที่สูงขึ้น
- ค่าเริ่มต้นสำหรับปัจจัยเกนอินพุตคือ 0.3
- ค่าดีฟอลต์สำหรับขีดจำกัดคิวบ์คือ 0.1
เราขอแนะนำให้แก้ไขค่าทั้งสองร่วมกัน สามารถพบได้ในรหัส ที่นี่
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันที่ใช้โดยตัวกรองนี้ โปรดดูการใช้งานที่มีให้ ที่นี่ หากต้องการเรียนรู้เพิ่มเติมว่าพารามิเตอร์ทั้งสองมีผลต่อผลลัพธ์อย่างไร เราแนะนำให้วางแผนการตอบสนองความถี่ของตัวกรอง และสังเกตว่าการตอบสนองความถี่เปลี่ยนแปลงอย่างไรด้วยค่าพารามิเตอร์ต่างๆ
เกนเอาต์พุตสำหรับการบิดเบือน
พารามิเตอร์นี้ควบคุมแอมพลิจูดการสั่นสะเทือนขั้นสุดท้าย เป็นการเพิ่มขั้นสุดท้ายหลังจากซอฟต์ลิมิตเตอร์ที่จำกัดแอมพลิจูดการสั่นสะเทือนให้น้อยกว่า 1 ค่าเริ่มต้นคือ 1.5 และสามารถแก้ไขได้ในโค้ด ที่นี่ ถ้าแรงสั่นสะเทือนน้อยเกินไป ให้เพิ่มค่า หากคุณได้ยินการสั่นของฮาร์ดแวร์แอคทูเอเตอร์ ให้ลดค่าลง