การปรับปรุงเฟรมเวิร์กของ 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_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
EFFECT_CLICK
EFFECT_DOUBLE_CLICK
EFFECT_HEAVY_CLICK
EFFECT_TICK
การสร้างองค์ความรู้ร่วมกันระหว่างผู้ผลิตอุปกรณ์กับนักพัฒนาซอฟต์แวร์เป็นกุญแจสำคัญ ปรับปรุงคุณภาพโดยรวมของการโต้ตอบการสัมผัสในระบบนิเวศของ Android ใช้เมนู รายการตรวจสอบพื้นฐาน การประเมินฮาร์ดแวร์ และ CDD เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้งานการโต้ตอบการสัมผัส
รูปที่ 3 กดแล้วปล่อย
การโต้ตอบการสัมผัสขั้นสูง
การโต้ตอบการสัมผัสที่สมบูรณ์คือหมวดหมู่การโต้ตอบการสัมผัสที่เพิ่มมากขึ้นซึ่งไม่ใช่แค่การรายการเดียว ผลกระทบจากแรงกระตุ้น Android มุ่งที่จะรองรับการโต้ตอบการสัมผัสที่สมบูรณ์ในระดับสูง ความสามารถในการเขียนและการปรับข้อความอย่างละเอียด ดังต่อไปนี้ รองรับ Use Case ใน Android 11 หรือต่ำกว่า
รูปที่ 4 การโต้ตอบการสัมผัสที่สมบูรณ์พร้อมพื้นผิวการเลื่อน
รูปที่ 5 การลากและเลื่อน
กรณีการใช้งานที่ 1: พื้นผิวการเลื่อน
หากมีการเกิดการตอบสนองแบบรู้สึกได้ซ้ำขณะนิ้วเลื่อนบนพื้นผิวสัมผัส (สำหรับ เช่น การลาก การปัด การสำรวจพื้นผิวที่มีพื้นผิวแบบรู้สึกได้ (Fantom Haptic Texture) เอฟเฟกต์แบบรู้สึกได้ซ้ำๆ ควรคมชัดและเนียน
ถ้าแต่ละเอฟเฟกต์เป็นแบบสั่นมากกว่าจะคมชัด ช่วงเวลาระหว่าง กิจกรรมที่เกิดซ้ำมักจะถูกลบออกไป ผลลัพธ์คือเรื่องปากต่อปากที่ยืดยาว สัญญาณที่แยกออกจากกันหลายๆ สัญญาณ
หากแอมพลิจูดไม่บอบบางพอ พลังงานการโต้ตอบแบบรู้สึกได้ก็จะสะสมขึ้น จากการทำซ้ำๆ ซึ่งส่งผลให้เกิดการตอบสนองแบบรู้สึกได้อย่างมากในช่วงท้าย การกล่าวซ้ำๆ
ใช้พื้นผิวแบบรู้สึกได้แบบสัมผัสง่ายสำหรับท่าทางสัมผัสการปัดและลาก
ใช้ CLOCK_TICK
และ TEXT_HANDLE_MOVE
ใน
HapticFeedbackConstants
ค่าคงที่เหล่านี้กำหนดลักษณะการทำซ้ำและแอมพลิจูดไว้ล่วงหน้า
สร้างเอฟเฟกต์ของคุณเอง
หากต้องการสร้างเอฟเฟกต์ของคุณเอง ให้เขียนการออกแบบโดยเรียงลำดับเข้าด้วยกัน
ของ PRIMITIVE_CLICK
และ PRIMITIVE_TICK
ใน
VibrationEffect.Composition
คุณสามารถปรับลักษณะของความซ้ำและสเกลแอมพลิจูดได้
ด้วย addPrimitive(int primitiveID, float scale, int delay)
การสนับสนุนขึ้นอยู่กับ
เวลา
CAP_COMPOSE_EFFECTS
ของ
อินเทอร์เฟซ 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 ของ Vibrator ต้องใช้การสนับสนุนการควบคุมภายนอก
- สำหรับการใช้ HIDL ให้ใช้
setExternalControl(bool enabled) generates (Status status)
- สำหรับการติดตั้งใช้งาน AIDL ให้ใช้
void setExternalControl(in boolean enabled)
- สำหรับการใช้ HIDL ให้ใช้
รูปที่ 8 การใช้การโต้ตอบการสัมผัสกับเสียงคู่
การโต้ตอบการสัมผัสกับเสียงคู่: เครื่องมือสร้าง Haptic
HapticGenerator
คือเอฟเฟกต์เสียง
เปิดตัวใน Android 12 ที่สามารถสร้างข้อมูลแบบรู้สึกได้จากช่องเสียงและ
เล่นแบบเรียลไทม์เป็นการโต้ตอบการสัมผัสแบบจับคู่เสียง
เอฟเฟกต์จะใช้กับ AudioTrack
ตามที่อธิบายไว้ในรูปที่ 9
รูปที่ 9 สถาปัตยกรรม Haptic Generator
วิธีตรวจสอบว่าอัลกอริทึมการสร้างการโต้ตอบแบบรู้สึกได้สร้างการโต้ตอบการสัมผัสที่มีคุณภาพสูง ปรับแต่งอัลกอริทึมการสร้างไปยังมอเตอร์แบบสั่นของอุปกรณ์โดยการปรับ พารามิเตอร์ที่กำหนดห่วงโซ่ของตัวกรองที่ใช้กับรูปแบบคลื่นเสียง ส่วนนี้จะอธิบายพารามิเตอร์เหล่านี้โดยละเอียดและอธิบายวิธีการปรับแต่ง ตามข้อกำหนดฮาร์ดแวร์ของคุณ
ความถี่เรโซแนนซ์สำหรับตัวกรองย่านความถี่ (Band Pass)
ความถี่สะท้อนของการสั่นคือ ความถี่ที่ตัวดำเนินการแบบรู้สึกได้ เอาต์พุตสูงสุด พารามิเตอร์นี้จะปรับตัวป้องกันเรโซเนเตอร์เป็นบางส่วน แยกฟังก์ชันการโอนการตอบสนองเพื่อให้มีแบนด์วิดท์กว้างขึ้น เฟรมเวิร์ก Android จะลิงก์ค่านี้กับเอาต์พุตของ เมธอด HAL ของการสั่น
IVibrator.getResonantFrequency
ค่าเริ่มต้นของพารามิเตอร์นี้คือ 150Hz ซึ่งแก้ไขได้ใน ที่นี่
กำลังปรับมาตรฐานสำหรับซองจดหมายที่ช้า
พารามิเตอร์นี้ระบุเลขชี้กำลังในการแปลงค่าบางส่วนให้เป็นมาตรฐาน (การควบคุมค่าเกนอัตโนมัติ) โดยมีค่าเริ่มต้นเป็น -0.8 ซึ่งหมายความว่า 80% ของรูปแบบช่วงไดนามิกถูกลบโดยขั้นตอนการควบคุมค่าเกนนี้ ซึ่งแก้ไขได้ในโค้ดที่นี่
ปัจจัย Q สำหรับตัวกรองการหยุดแถบความถี่
ปัจจัยด้านคุณภาพของการสั่น (ปัจจัย Q) กำหนดด้วยพารามิเตอร์ 2 ตัวดังนี้
ศูนย์ Q คือค่าคุณภาพของเลขศูนย์ในตัวกรองการหยุดแบนด์ภาพ จะยกเลิกเสียงสะท้อนได้บางส่วน
เสา Q ซึ่งเป็นค่าคุณภาพของขั้วต่อในฟิลเตอร์หยุดสายนาฬิกา
อัตราส่วนของทั้ง 2 ค่าจะจำกัดการยับยั้งเสียงสะท้อนตามลำดับ เพื่อเพิ่มความถี่ที่ต่ำลงและขยายการตอบสนองของอัลกอริทึม ตัวอย่างเช่น ค่าเริ่มต้นคือ 8 สำหรับ Zero Q และ 4 สำหรับผลิตภัณฑ์ Pole Q อัตราส่วน 2 จำกัดการระงับเรโซแนนซ์ไว้ที่ 2 (6 dB) เฟรมเวิร์ก Android จะลิงก์ทั้ง 2 ค่ากับเอาต์พุตของ Vibrator HAL
IVibrator.getQFactor
หากค่าเริ่มต้นไม่ได้คำนึงถึงการหน่วงความแรงของมอเตอร์ ในอุปกรณ์ของคุณ เราขอแนะนำให้แก้ไขทั้ง 2 ค่าพร้อมกัน และ เพิ่มหรือลดทั้ง 2 อย่าง อัตราส่วนของศูนย์ Q ต่อเสา Q ควรมากกว่า 1 ซึ่งแก้ไขได้ในโค้ดที่นี่
ความถี่มุมในการบิดเบี้ยว
ความถี่มุมจะถูกใช้โดยตัวกรองโลว์พาสซึ่งระงับ การสั่นระดับต่ำและช่วยเพิ่มระดับที่สูงขึ้นโดยใช้การบิดเบี้ยวแบบลูกบาศก์ โดยมีค่าเริ่มต้นเป็น 300Hz ซึ่งแก้ไขได้ในโค้ดที่นี่
อินพุตเกนและเกณฑ์ลูกบาศก์สำหรับการบิดเบี้ยว
พารามิเตอร์เหล่านี้ใช้โดยตัวกรองการบิดเบี้ยวที่ไม่เป็นเชิงเส้นและใช้กับองค์ประกอบ รูปแบบคลื่นอินพุตที่เพิ่มแอมพลิจูดของสัญญาณความถี่ต่ำและ ก็จะเป็นการเพิ่มความถี่
- ค่าเริ่มต้นของปัจจัยที่ได้รับอินพุตคือ 0.3
- ค่าเริ่มต้นสำหรับเกณฑ์ลูกบาศก์คือ 0.1
เราขอแนะนำให้แก้ไขทั้ง 2 ค่าร่วมกัน คุณดูข้อมูลนี้ได้ในโค้ด ที่นี่
ดูข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันที่ตัวกรองนี้ใช้ได้ที่ ติดตั้งใช้งานได้ที่นี่ หากต้องการดูข้อมูลเพิ่มเติมว่าพารามิเตอร์ทั้ง 2 ตัวนี้มีผลต่อเอาต์พุตอย่างไร เรา ขอแนะนำให้พล็อตการตอบสนองความถี่ของตัวกรองและสังเกต การตอบสนองความถี่จะเปลี่ยนไปตามค่าพารามิเตอร์ที่แตกต่างกัน
เอาต์พุตเกนสําหรับการบิดเบี้ยว
พารามิเตอร์นี้ควบคุมแอมพลิจูดการสั่นสุดท้าย นับว่าเป็นประโยชน์สุดท้าย ใช้หลังจากตัวจำกัดแบบนุ่มนวลที่จำกัดแอมพลิจูดการสั่นให้เหลือน้อยกว่า 1. ค่าเริ่มต้นคือ 1.5 และสามารถแก้ไขได้ในโค้ด ที่นี่ หากการสั่นเบาเกินไป ให้เพิ่มค่า ถ้าคุณได้ยินเสียง เสียงฮาร์ดแวร์แอคชูเอเตอร์ ลดค่าลง