รากฐาน UX สำหรับเฟรมเวิร์กระบบสัมผัส

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

หลักการ UX

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

ตารางต่อไปนี้แสดงรายการ Haptics API ที่มีอยู่ทั้งหมด

เอพีไอ วิธีการ ปีเพิ่ม
android.view.HapticFeedbackConstants
  • CONTEXT_คลิก
  • CLOCK_TICK
  • VIRTUAL_KEY
  • คีย์บอร์ด_TAP
  • LONG_PRESS
ก่อนปี 2559
  • คีย์บอร์ด_เพรส
  • คีย์บอร์ด_ปล่อย
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (แอนดรอยด์ 8)
  • ยืนยัน
  • ปฏิเสธ
  • GESTURE_START
  • ท่าทาง_END
2020 (แอนดรอยด์ 11)
หุ่นยนต์ดู
  • ดำเนินการข้อเสนอแนะแบบสัมผัส ()
ก่อนปี 2559
android.os.สั่น
  • สั่น()
  • มีเครื่องสั่น()
ก่อนปี 2559
  • มีความกว้างการควบคุม()
2017 (แอนดรอยด์ 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffects รองรับ ()
  • เป็นแบบดั้งเดิมได้รับการสนับสนุน()
2020 (แอนดรอยด์ 11)
android.os.เอฟเฟกต์การสั่นสะเทือน
  • createOneShot()
  • สร้างรูปคลื่น()
2017 (แอนดรอยด์ 8)
  • EFFECT_TICK
  • EFFECT_คลิก
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefed()
2019 (แอนดรอยด์ 10)
android.os.VibrationEffect.องค์ประกอบ
  • PRIMITIVE_TICK
  • PRIMITIVE_คลิก
  • เพิ่มดั้งเดิม()
  • เขียน()
2020 (แอนดรอยด์ 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsปิดเสียง()
2019 (แอนดรอยด์ 10)

การสั่นสะเทือนที่ฉวัดเฉวียน

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

ระบบสัมผัสที่ชัดเจน

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

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

ใช้เอฟเฟ็กต์การค่อยๆ เปลี่ยน

  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 ต้องใช้การสนับสนุนการควบคุมภายนอก

ระบบสัมผัสเสียงควบคู่กัน

รูปที่ 8 การใช้ระบบสัมผัสเสียงควบคู่กัน

ระบบสัมผัสแบบสัมผัสควบคู่กับเสียง: เครื่องสร้างระบบสัมผัสแบบสัมผัส

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

Haptic Generator architecture

รูปที่ 9 สถาปัตยกรรมตัวสร้างแบบสัมผัส

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

  1. ความถี่เรโซแนนซ์สำหรับตัวกรองแบนด์พาส

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

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

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

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

  3. ปัจจัย 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 ซึ่งสามารถแก้ไขได้ในรหัส ที่นี่

  4. ความถี่มุมสำหรับการบิดเบือน

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

  5. อัตราขยายอินพุตและเกณฑ์คิวบ์สำหรับการบิดเบือน

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

    • ค่าเริ่มต้นสำหรับปัจจัยการรับอินพุตคือ 0.3
    • ค่าดีฟอลต์สำหรับขีดจำกัดคิวบ์คือ 0.1

    เราขอแนะนำให้แก้ไขทั้งสองค่าพร้อมกัน สามารถพบได้ในรหัส ที่นี่

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

  6. อัตราขยายเอาต์พุตสำหรับการบิดเบือน

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