รากฐาน UX สำหรับกรอบการทำงานแบบสัมผัส

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

หลักการ UX

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

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

API วิธีการ ปีที่เพิ่ม
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
ก่อนปี 2559
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (แอนดรอยด์ 8)
  • ยืนยัน
  • ปฏิเสธ
  • GESTURE_START
  • GESTURE_END
2020 (แอนดรอยด์ 11)
android.View
  • ดำเนินการHapticFeedback()
ก่อนปี 2559
android.os.Vibrator
  • สั่น()
  • มีเครื่องสั่น ()
ก่อนปี 2559
  • hasAmplitudeControl()
2017 (แอนดรอยด์ 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • เป็นPrimitivesSupported()
2020 (แอนดรอยด์ 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (แอนดรอยด์ 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • สร้างที่กำหนดไว้ล่วงหน้า ()
2019 (แอนดรอยด์ 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • เขียน()
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 การกดและปล่อย

แฮปติคที่อุดมไปด้วย

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

Rich Haptics

รูปที่ 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 ของอินเทอร์ เฟซ 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 ต้องใช้การสนับสนุนการควบคุมภายนอก

เสียงควบคู่ Haptics

รูปที่ 8 การนำ Haptics ที่เชื่อมต่อเสียงมาใช้

แฮบติคแบบจับคู่เสียง: Haptic Generator

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

Haptic Generator architecture

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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