รากฐานของ UX สำหรับเฟรมเวิร์กแบบรู้สึกได้

การปรับปรุงเฟรมเวิร์กของ Android ทั้งหมดที่สร้างขึ้นจากการโต้ตอบการสัมผัสนั้นทำงานด้วย ชุดหลักการ UX ที่มีการพัฒนาในอัตราที่เท่าๆ กัน องค์ประกอบปัจจุบัน หลักการรวมถึงการแทนที่การสั่นเตือนด้วยการโต้ตอบการสัมผัสที่ชัดเจน และ สำรวจการโต้ตอบการสัมผัสที่สมบูรณ์

หลักการ UX

รูปที่ 1 หลักการในปัจจุบัน

ตารางต่อไปนี้แสดง API การโต้ตอบการสัมผัสทั้งหมดที่มี

API วิธีการ ปีที่เพิ่ม
android.view.HapticFeedbackConstants
  • CONTEXT_คลิก
  • เครื่องหมายถูกสำหรับนาฬิกา
  • คีย์เสมือน
  • แป้นพิมพ์แป้นพิมพ์
  • กดค้าง
ก่อน 2016
  • KEYBOARD_PRESS
  • ปล่อยแป้นพิมพ์
  • เคลื่อนไหวด้วยมือ
  • การเผยแพร่คีย์เสมือน
2017 (Android 8)
  • ยืนยัน
  • ปฏิเสธ
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • actionsHapticFeedback()
ก่อน 2016
android.os.Vibrator
  • สั่น()
  • hasVibrator()
ก่อน 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • เอฟเฟกต์
  • EFFECT_คลิก
  • EFFECT_HEAVY_คลิก
  • EFFECT_DOUBLE_คลิก
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • เครื่องหมายถูกที่สำคัญ
  • การคลิกที่สำคัญ
  • addPrimitive()
  • เขียน()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

การสั่นเตือน

ย้อนไปดูเพจเจอร์และฟีเจอร์โฟน ERM คุณภาพต่ำแต่ประหยัดพลังงาน ระบบใช้การสั่นแบบสั่นแทนเสียงเรียกเข้า โหมดเงียบ ส่วนประกอบของฮาร์ดแวร์เดิมที่ส่งเสียงดังและไม่เป็นที่ต้องการ เสียงที่ได้ยินอาจเป็นอันตรายต่อ UX แบบรู้สึกได้ โดยการแสดงผลคุณภาพต่ำ (สำหรับ เช่น โทรศัพท์ราคาถูก เสีย)

ล้างการโต้ตอบการสัมผัส

การโต้ตอบการสัมผัสที่ชัดเจนรองรับการรับความรู้สึกเมื่อมีการเปลี่ยนแปลงสถานะไม่ต่อเนื่อง (ตัวอย่างเช่น การเปลี่ยนแปลงไบนารีระหว่างกระบวนการเปิด/ปิดเครื่อง) เนื่องจากลักษณะของ ราคาไม่แพง การโต้ตอบการสัมผัสที่ชัดเจนจะสร้างขึ้นเป็นเอนทิตีเดียว (สำหรับ เช่น การตอบสนองแบบรู้สึกได้ 1 รายการต่อเหตุการณ์อินพุต 1 เหตุการณ์)

Android มุ่งให้การโต้ตอบการสัมผัสที่ชัดเจนด้วยความรู้สึกที่รุนแรงแต่คมกริบมากกว่า มากกว่าความรู้สึกที่มีชีวิตชีวาหรืออ่อนไหว

ค่าคงที่แบบสัมผัสที่กำหนดไว้ล่วงหน้าซึ่งสร้างขึ้นเพื่อรองรับการโต้ตอบการสัมผัสที่ชัดเจนมีดังนี้ ดังต่อไปนี้

ใน HapticFeedbackConstants

  • 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 มุ่งที่จะรองรับการโต้ตอบการสัมผัสที่สมบูรณ์ในระดับสูง ความสามารถในการเขียนและการปรับข้อความอย่างละเอียด ดังต่อไปนี้ รองรับ 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 ไปที่ แอมพลิจูดเป้าหมาย การสั่นนานจะสร้างความสนใจที่รับรู้ได้ง่าย การโต้ตอบการสัมผัส แต่การสั่นนานอย่างกะทันหันอาจทำให้ผู้ใช้ตกใจในที่เงียบๆ และมักจะทำเสียงหึ่งๆ ได้ วิธีสร้าง การสั่นนานที่น่ารื่นรมย์ ใช้เอฟเฟ็กต์ค่อยๆ เริ่มที่ตอนต้นของความยาว การสั่น ซึ่งจะสร้างการเปลี่ยนแอมพลิจูดได้อย่างราบรื่นใน แอมพลิจูดเป้าหมาย

ใช้เอฟเฟกต์ค่อยๆ เข้า

  1. ตรวจสอบความสามารถของฮาร์ดแวร์ของการควบคุมแอมพลิจูดด้วย android.os.Vibrator.hasAmplitudeControl()

    • ผลการค้นหาต้องเป็น true จึงจะสร้างผลลัพธ์ที่สะดวกด้วย แอมพลิจูดที่แตกต่างกัน
  2. ใช้ VibrationEffect .createWaveform(timings[], amplitudes[], int repeat)

  3. ปรับชุดของ timings[] และ amplitudes[] เพื่อสร้าง กราฟค่อยๆ เข้า ดังที่แสดงในรูปที่ 6

การสั่นนาน

รูปที่ 6 เส้นโค้งค่อยๆ ปรับการสั่นยาว

กรณีการใช้งานที่ 3: การโต้ตอบการสัมผัสแบบจับคู่เสียง

การโต้ตอบการสัมผัสกับเสียงคือรูปแบบการโต้ตอบการสัมผัสที่คู่กับจังหวะของเสียง เพื่อดึงดูดความสนใจของผู้ใช้

การโต้ตอบการสัมผัสกับเสียง: ประโยชน์

หากต้องการใช้การโต้ตอบการสัมผัสกับเสียง ให้รวมการโต้ตอบการสัมผัสที่ชัดเจนเข้ากับการสั่นยาว การรับความรู้สึกที่รุนแรงแต่สั้นจากการโต้ตอบการสัมผัสที่ชัดเจนจะให้ความรู้สึกที่แยกออกจากกัน ที่จับต้องได้ เมื่อรวมกับสิ่งเร้าระดับสูงที่มีระยะเวลา การสั่นนี้ช่วยดึงดูดความสนใจของผู้ใช้ได้อย่างดีเยี่ยม

คุณควรพิจารณารูปแบบจังหวะของความรู้สึก หากไม่รู้จะพูดอะไร จังหวะที่มันอยู่ ผู้ใช้จะได้รับความรู้สึกว่ารู้สึกกระสับกระส่ายและรู้สึกเหมือนกำลังสั่น เพื่อเพิกเฉยต่อสิ่งเหล่านั้น

คู่รักเสียง

รูปที่ 7 ตัวอย่างการโต้ตอบการสัมผัสของคู่เสียง

การโต้ตอบการสัมผัสกับเสียง: เคล็ดลับสำหรับการใช้งาน

การติดตั้งใช้งานการโต้ตอบการสัมผัสกับเสียงต้องอาศัยความเข้าใจพื้นฐานเกี่ยวกับเนื้อหา การเล่นทั้งช่องเสียงและช่องทางการตอบสนองแบบรู้สึกได้ โปรดคำนึงถึงสิ่งต่อไปนี้

  • ใช้MediaPlayer หรือ SoundPool ใหม่

    • เนื้อหาในรูปแบบ OGG ที่มีคีย์ข้อมูลเมตาพิเศษ (ANDROID_HAPTIC ตามด้วยช่องทางการโต้ตอบการสัมผัสจำนวนหนึ่ง) บ่งชี้ถึง การแสดงข้อมูลการโต้ตอบการสัมผัสและการเล่นด้วย MediaPlayer และ SoundPool
  • ระบุการรองรับการโต้ตอบการสัมผัสและการเล่นไฟล์เสียงใน 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 ต้องใช้การสนับสนุนการควบคุมภายนอก

การโต้ตอบการสัมผัสแบบคู่ต่อเสียง

รูปที่ 8 การใช้การโต้ตอบการสัมผัสกับเสียงคู่

การโต้ตอบการสัมผัสกับเสียงคู่: เครื่องมือสร้าง Haptic

HapticGenerator คือเอฟเฟกต์เสียง เปิดตัวใน Android 12 ที่สามารถสร้างข้อมูลแบบรู้สึกได้จากช่องเสียงและ เล่นแบบเรียลไทม์เป็นการโต้ตอบการสัมผัสแบบจับคู่เสียง เอฟเฟกต์จะใช้กับ AudioTrack ตามที่อธิบายไว้ในรูปที่ 9

สถาปัตยกรรม Haptic Generator

รูปที่ 9 สถาปัตยกรรม Haptic Generator

วิธีตรวจสอบว่าอัลกอริทึมการสร้างการโต้ตอบแบบรู้สึกได้สร้างการโต้ตอบการสัมผัสที่มีคุณภาพสูง ปรับแต่งอัลกอริทึมการสร้างไปยังมอเตอร์แบบสั่นของอุปกรณ์โดยการปรับ พารามิเตอร์ที่กำหนดห่วงโซ่ของตัวกรองที่ใช้กับรูปแบบคลื่นเสียง ส่วนนี้จะอธิบายพารามิเตอร์เหล่านี้โดยละเอียดและอธิบายวิธีการปรับแต่ง ตามข้อกำหนดฮาร์ดแวร์ของคุณ

  1. ความถี่เรโซแนนซ์สำหรับตัวกรองย่านความถี่ (Band Pass)

    ความถี่สะท้อนของการสั่นคือ ความถี่ที่ตัวดำเนินการแบบรู้สึกได้ เอาต์พุตสูงสุด พารามิเตอร์นี้จะปรับตัวป้องกันเรโซเนเตอร์เป็นบางส่วน แยกฟังก์ชันการโอนการตอบสนองเพื่อให้มีแบนด์วิดท์กว้างขึ้น เฟรมเวิร์ก Android จะลิงก์ค่านี้กับเอาต์พุตของ เมธอด HAL ของการสั่น IVibrator.getResonantFrequency

    ค่าเริ่มต้นของพารามิเตอร์นี้คือ 150Hz ซึ่งแก้ไขได้ใน ที่นี่

  2. กำลังปรับมาตรฐานสำหรับซองจดหมายที่ช้า

    พารามิเตอร์นี้ระบุเลขชี้กำลังในการแปลงค่าบางส่วนให้เป็นมาตรฐาน (การควบคุมค่าเกนอัตโนมัติ) โดยมีค่าเริ่มต้นเป็น -0.8 ซึ่งหมายความว่า 80% ของรูปแบบช่วงไดนามิกถูกลบโดยขั้นตอนการควบคุมค่าเกนนี้ ซึ่งแก้ไขได้ในโค้ดที่นี่

  3. ปัจจัย 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 ซึ่งแก้ไขได้ในโค้ดที่นี่

  4. ความถี่มุมในการบิดเบี้ยว

    ความถี่มุมจะถูกใช้โดยตัวกรองโลว์พาสซึ่งระงับ การสั่นระดับต่ำและช่วยเพิ่มระดับที่สูงขึ้นโดยใช้การบิดเบี้ยวแบบลูกบาศก์ โดยมีค่าเริ่มต้นเป็น 300Hz ซึ่งแก้ไขได้ในโค้ดที่นี่

  5. อินพุตเกนและเกณฑ์ลูกบาศก์สำหรับการบิดเบี้ยว

    พารามิเตอร์เหล่านี้ใช้โดยตัวกรองการบิดเบี้ยวที่ไม่เป็นเชิงเส้นและใช้กับองค์ประกอบ รูปแบบคลื่นอินพุตที่เพิ่มแอมพลิจูดของสัญญาณความถี่ต่ำและ ก็จะเป็นการเพิ่มความถี่

    • ค่าเริ่มต้นของปัจจัยที่ได้รับอินพุตคือ 0.3
    • ค่าเริ่มต้นสำหรับเกณฑ์ลูกบาศก์คือ 0.1

    เราขอแนะนำให้แก้ไขทั้ง 2 ค่าร่วมกัน คุณดูข้อมูลนี้ได้ในโค้ด ที่นี่

    ดูข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันที่ตัวกรองนี้ใช้ได้ที่ ติดตั้งใช้งานได้ที่นี่ หากต้องการดูข้อมูลเพิ่มเติมว่าพารามิเตอร์ทั้ง 2 ตัวนี้มีผลต่อเอาต์พุตอย่างไร เรา ขอแนะนำให้พล็อตการตอบสนองความถี่ของตัวกรองและสังเกต การตอบสนองความถี่จะเปลี่ยนไปตามค่าพารามิเตอร์ที่แตกต่างกัน

  6. เอาต์พุตเกนสําหรับการบิดเบี้ยว

    พารามิเตอร์นี้ควบคุมแอมพลิจูดการสั่นสุดท้าย นับว่าเป็นประโยชน์สุดท้าย ใช้หลังจากตัวจำกัดแบบนุ่มนวลที่จำกัดแอมพลิจูดการสั่นให้เหลือน้อยกว่า 1. ค่าเริ่มต้นคือ 1.5 และสามารถแก้ไขได้ในโค้ด ที่นี่ หากการสั่นเบาเกินไป ให้เพิ่มค่า ถ้าคุณได้ยินเสียง เสียงฮาร์ดแวร์แอคชูเอเตอร์ ลดค่าลง