Nền tảng trải nghiệm người dùng cho khung phản hồi xúc giác

Tất cả các điểm cải tiến của khung Android được xây dựng dựa trên phản hồi xúc giác đều được thúc đẩy bởi một bộ nguyên tắc trải nghiệm người dùng đang phát triển với tốc độ tương đương. Các nguyên tắc hiện tại liên quan đến việc thay thế chế độ rung mạnh bằng phản hồi xúc giác rõ ràng và khám phá phản hồi xúc giác phong phú.

Nguyên tắc về trải nghiệm người dùng

Hình 1. Các nguyên tắc hiện tại.

Bảng sau đây liệt kê tất cả các API phản hồi xúc giác hiện có:

API Phương thức và hằng số Năm thêm
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
Trước năm 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Trước năm 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
Trước năm 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

Rung mạnh

Từ thời máy nhắn tin và điện thoại phổ thông, chế độ rung dựa trên chuông có chất lượng thấp nhưng tiết kiệm pin đã được dùng để thay thế chuông âm thanh trong chế độ im lặng. Các thành phần phần cứng cũ tạo ra tiếng ồn lớn và khó chịu có thể gây hại cho trải nghiệm người dùng xúc giác bằng cách mang lại ấn tượng chất lượng thấp (ví dụ: điện thoại rẻ tiền, bị hỏng).

Xoá phản hồi xúc giác

Phản hồi xúc giác rõ ràng hỗ trợ cảm giác về các thay đổi trạng thái rời rạc (ví dụ: các thay đổi nhị phân trong quá trình bật và tắt nguồn). Do tính chất của chế độ rời rạc, các tín hiệu phản hồi xúc giác rõ ràng được tạo dưới dạng một thực thể duy nhất (ví dụ: một hiệu ứng phản hồi xúc giác cho mỗi sự kiện đầu vào).

Android hướng đến việc mang lại phản hồi xúc giác rõ ràng với cảm giác mạnh mẽ nhưng sắc nét thay vì cảm giác rung hoặc mềm.

Các hằng số xúc giác được xác định trước được tạo để hỗ trợ các hiệu ứng xúc giác rõ ràng, bao gồm các phần tử sau.

Trong 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

Trong VibrationEffect:

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

Việc xây dựng kiến thức chung giữa các nhà sản xuất thiết bị và nhà phát triển là yếu tố then chốt để nâng cao chất lượng tổng thể của hiệu ứng xúc giác trong hệ sinh thái Android. Sử dụng danh sách kiểm tra cơ bản, đánh giá phần cứngCDD để tìm hiểu thêm về cách triển khai phản hồi xúc giác.

Nhấn và thả

Hình 2. Nhấn và thả.

Phản hồi xúc giác đa dạng

Tương tác xúc giác đa dạng là một danh mục tương tác xúc giác đang phát triển, vượt xa các hiệu ứng dựa trên một xung lực duy nhất. Android hướng đến việc hỗ trợ các hiệu ứng xúc giác phong phú với khả năng kết hợp và điều chỉnh cao ở mức độ chi tiết. Các trường hợp sử dụng sau đây được hỗ trợ trong Android 11 trở xuống.

Phản hồi xúc giác đa dạng

Hình 3. Công nghệ cảm ứng phong phú với kết cấu trượt.

Kéo và vuốt

Hình 4. Kéo và vuốt.

Trường hợp sử dụng 1: Kết cấu trượt

Nếu hiệu ứng xúc giác được lặp lại trong khi ngón tay trượt trên bề mặt cảm ứng (ví dụ: kéo, vuốt, khám phá bề mặt bằng kết cấu xúc giác ảo), thì các hiệu ứng xúc giác lặp lại nên rõ ràng và tinh tế.

Nếu hiệu ứng riêng lẻ có âm thanh rè rè thay vì rõ ràng, thì các khoảng thời gian giữa các lần lặp lại có thể bị xoá. Kết quả là một tiếng rung dài, thay vì nhiều tín hiệu rời rạc.

Nếu biên độ không đủ tinh tế, thì năng lượng xúc giác cảm nhận được sẽ tích tụ thông qua việc lặp lại, dẫn đến xúc giác quá mạnh ở cuối quá trình lặp lại.

Triển khai kết cấu xúc giác trên bề mặt cho cử chỉ vuốt và kéo

Sử dụng CLOCK_TICKTEXT_HANDLE_MOVE trong HapticFeedbackConstants. Các hằng số này xác định trước các đặc điểm của độ lặp lại và biên độ.

Tạo hiệu ứng của riêng bạn

Để tạo hiệu ứng của riêng bạn, hãy tạo một thiết kế bằng cách kết hợp các chuỗi PRIMITIVE_CLICKPRIMITIVE_TICK trong VibrationEffect.Composition. Bạn có thể điều chỉnh các đặc điểm của tần số lặp lại và thang biên độ bằng cách sử dụng addPrimitive(int primitiveID, float scale, int delay). Chế độ hỗ trợ dựa vào khả năng CAP_COMPOSE_EFFECTS của Giao diện HAL của Bộ rung.

Trường hợp sử dụng 2: Rung dài có hiệu ứng tăng tốc

Rung dài là một rung động có biên độ mượt mà, chuyển từ 0 sang biên độ mục tiêu. Rung lâu có thể tạo ra phản hồi xúc giác có thể nhận thấy được. Tuy nhiên, chế độ rung dài đột ngột có thể khiến người dùng giật mình trong môi trường yên tĩnh và thường tạo ra tiếng ồn có thể nghe thấy. Để tạo ra một rung động dài dễ chịu hơn, hãy áp dụng hiệu ứng tăng tốc ở đầu rung động dài. Thao tác này tạo ra một quá trình chuyển đổi biên độ mượt mà, hướng đến biên độ mục tiêu.

Áp dụng hiệu ứng tăng tốc

  1. Kiểm tra các chức năng phần cứng của chế độ kiểm soát biên độ bằng android.os.Vibrator.hasAmplitudeControl().

    • Kết quả phải là true để tạo hiệu ứng tăng tốc với biên độ thay đổi.
  2. Dùng VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).

  3. Điều chỉnh chuỗi timings[]amplitudes[] để tạo đường cong tăng tốc, như minh hoạ trong Hình 5.

Rung lâu

Hình 5. Đường cong tăng dần độ rung lâu.

Trường hợp sử dụng 3: Phản hồi xúc giác kết hợp với âm thanh

Phản hồi xúc giác kết hợp với âm thanh là các mẫu phản hồi xúc giác kết hợp với nhịp điệu của âm thanh để thu hút sự chú ý của người dùng.

Hiệu ứng rung phản hồi dựa trên âm thanh: Lợi ích

Để triển khai phản hồi xúc giác kết hợp âm thanh, hãy kết hợp phản hồi xúc giác rõ ràng với chế độ rung dài. Cảm giác xúc giác mạnh mẽ nhưng ngắn gọn từ phản hồi xúc giác rõ ràng mang đến các mẫu nhịp điệu riêng biệt. Khi kết hợp với mức độ kích thích cao mà chế độ rung dài mang lại, điều này sẽ giúp thu hút sự chú ý của người dùng một cách hiệu quả.

Bạn cần cân nhắc các kiểu nhịp điệu của cảm giác. Nếu không có cảm giác về nhịp điệu, người dùng sẽ cảm nhận được các cảm giác xúc giác như những tiếng rung ngẫu nhiên và có xu hướng bỏ qua chúng.

Audio Couple

Hình 6. Ví dụ về haptics cho cặp âm thanh.

Phản hồi xúc giác kết hợp với âm thanh: Mẹo triển khai

Để triển khai phản hồi xúc giác kết hợp với âm thanh, bạn cần có kiến thức cơ bản về việc phát nội dung của cả kênh âm thanh và kênh phản hồi xúc giác. Hãy lưu ý những điều sau:

  • Dùng các lớp MediaPlayer hoặc SoundPool.

    • Các tài sản ở định dạng OGG có một khoá siêu dữ liệu đặc biệt (ANDROID_HAPTIC theo sau là một số kênh xúc giác) cho biết sự hiện diện của dữ liệu xúc giác và quá trình phát bằng MediaPlayerSoundPool.
  • Cho biết khả năng hỗ trợ phản hồi xúc giác và phát âm thanh trong audio_policy_configuration.xml.

    • Sử dụng hồ sơ đầu ra có kênh phản hồi xúc giác AUDIO_CHANNEL_OUT_HAPTIC_A|B.
    • Đối với luồng đầu ra có các kênh xúc giác, hãy nhớ rằng các kênh xúc giác được trình bày dưới dạng các kênh bổ sung trong dữ liệu.

    Ví dụ

    Nếu mặt nạ kênh cho luồng đầu ra có dạng như sau:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    Sau đó, mọi mẫu sẽ có dạng như sau:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • Thay đổi AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) thành false để phát kênh xúc giác.

    • Theo mặc định, các kênh xúc giác sẽ bị tắt tiếng (true).
    • Các trường hợp sử dụng bao gồm nhạc chuông và âm thanh giao diện người dùng có phản hồi và xúc giác đồng bộ.
  • HAL Bộ rung phải triển khai tính năng hỗ trợ điều khiển bên ngoài.

Hiệu ứng rung phản hồi kết hợp với âm thanh

Hình 7. Triển khai phản hồi xúc giác kết hợp với âm thanh.

Phản hồi xúc giác kết hợp với âm thanh: HapticGenerator

HapticGenerator là một hiệu ứng âm thanh được giới thiệu trong Android 12. Hiệu ứng này có thể tạo dữ liệu xúc giác từ một kênh âm thanh và phát dữ liệu đó theo thời gian thực dưới dạng phản hồi xúc giác kết hợp với âm thanh. Hiệu ứng được áp dụng cho AudioTrack như minh hoạ trong Hình 8:

Cấu trúc Haptic Generator

Hình 8. Cấu trúc Haptic Generator.

Hình ảnh trực quan về cấu trúc này cho thấy vị trí mà Trình tạo phản hồi xúc giác được áp dụng cho luồng âm thanh đầu vào của người dùng trước khi luồng âm thanh đó được gửi đến HAL âm thanh. Trình tạo được áp dụng sau khi AudioMixer phân chia dữ liệu âm thanh và dữ liệu xúc giác, đồng thời trước bất kỳ hiệu ứng âm thanh nào khác. Đầu ra của trình tạo này sẽ ghi đè mọi dữ liệu xúc giác trước đó trong luồng.

Để đảm bảo thuật toán trình tạo phản hồi xúc giác tạo ra phản hồi xúc giác chất lượng cao, hãy điều chỉnh thuật toán tạo cho phù hợp với động cơ rung của thiết bị bằng cách điều chỉnh các tham số định cấu hình chuỗi bộ lọc mà thuật toán áp dụng cho dạng sóng âm thanh. Phần này mô tả chi tiết các tham số này và giải thích cách điều chỉnh các tham số cho phù hợp với quy cách phần cứng của bạn.

  • Tần số cộng hưởng cho bộ lọc thông dải

    Tần số cộng hưởng của bộ rung là tần số mà bộ truyền động xúc giác có công suất đầu ra tối đa. Tham số này điều chỉnh một bộ chống cộng hưởng để làm phẳng một phần hàm truyền phản hồi, nhằm có được băng thông rộng hơn. Khung Android sẽ tự động liên kết giá trị này với đầu ra của phương thức Vibrator HAL IVibrator.getResonantFrequency.

    Giá trị mặc định của tham số này là 150 Hz. Bạn có thể sửa đổi giá trị này trong .

  • Công suất chuẩn hoá cho phong bì chậm

    Tham số này xác định số mũ trong quá trình chuẩn hoá một phần (kiểm soát mức tăng tự động). Giá trị mặc định của tham số này là -0,8, tức là 80% biến thể dải động sẽ bị loại bỏ trong bước kiểm soát mức tăng này. Bạn có thể sửa đổi thông tin này trong .

  • Hệ số Q của bộ lọc chặn băng tần

    Hệ số chất lượng của bộ rung (hệ số Q) được xác định bằng 2 tham số:

    • Zero Q, hệ số chất lượng của các số không trong bộ lọc chặn băng tần, giúp huỷ một phần cộng hưởng

    • Pole Q, hệ số chất lượng của các cực trong bộ lọc chặn băng tần

    Tỷ lệ của hai giá trị đó giới hạn việc triệt tiêu cộng hưởng để tăng tần số thấp hơn và mở rộng phản hồi của thuật toán. Ví dụ: các giá trị mặc định là 8 cho Zero Q và 4 cho Pole Q tạo ra tỷ lệ 2, giới hạn mức độ triệt tiêu cộng hưởng theo hệ số 2 (6 dB). Khung Android liên kết cả hai giá trị với đầu ra của phương thức HAL Vibrator IVibrator.getQFactor.

    Nếu các giá trị mặc định không tính đến việc giảm sức mạnh của động cơ trong thiết bị, bạn nên sửa đổi cả hai giá trị cùng một lúc, đồng thời tăng hoặc giảm cả hai giá trị. Tỷ lệ giữa Zero Q và Pole Q phải lớn hơn 1. Bạn có thể sửa đổi thông tin này trong .

  • Tần số góc cho độ méo

    Tần số góc được áp dụng bằng bộ lọc thông thấp giúp triệt tiêu rung động ở mức thấp và tăng cường rung động ở mức cao hơn bằng cách sử dụng độ méo dạng lập phương. Giá trị mặc định là 300 Hz. Bạn có thể sửa đổi giá trị này trong .

  • Độ khuếch đại đầu vào và ngưỡng khối cho hiện tượng méo tiếng

    Các thông số này được dùng bởi một bộ lọc biến dạng phi tuyến tính được áp dụng cho dạng sóng đầu vào, giúp giảm biên độ của các tín hiệu tần số thấp và tăng biên độ của các tín hiệu tần số cao.

    • Giá trị mặc định cho hệ số tăng đầu vào là 0,3.
    • Giá trị mặc định cho ngưỡng khối là 0,1.

    Bạn nên sửa đổi cả hai giá trị cùng một lúc. Bạn có thể tìm thấy các mã này trong .

    Để biết thêm thông tin về hàm mà bộ lọc này áp dụng, hãy tham khảo quá trình triển khai trong .

    Để tìm hiểu thêm về cách hai thông số này ảnh hưởng đến đầu ra, bạn nên vẽ biểu đồ phản hồi tần số của các bộ lọc và quan sát cách các phản hồi tần số thay đổi theo các giá trị thông số khác nhau.

  • Độ khuếch đại đầu ra cho độ méo tiếng

    Tham số này kiểm soát biên độ rung cuối cùng. Đây là mức tăng cuối cùng được áp dụng sau một bộ giới hạn mềm giúp giới hạn biên độ rung ở mức dưới 1. Giá trị mặc định là 1, 5 và bạn có thể sửa đổi giá trị này trong .

    Nếu độ rung quá nhẹ, hãy tăng giá trị. Nếu bạn nghe thấy phần cứng bộ truyền động kêu lạch cạch, hãy giảm giá trị.