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