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 về khung Android được xây dựng xung quanh tính năng 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ế rung ồn ào 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. Nguyên tắc hiện tại.

Bảng sau đây liệt kê tất cả API haptics 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 ồn

Từ thời máy nhắn tin và điện thoại phổ thông, các chế độ rung dựa trên chuông rô-to lệch tâm (ERM) chất lượng thấp nhưng tiết kiệm pin đã được dùng để thay thế cho chuông báo bằng âm thanh ở chế độ im lặng. Các thành phần phần cứng cũ tạo ra âm thanh to 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 giá rẻ, bị hỏng).

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

Cảm ứng rõ ràng hỗ trợ cảm giác về các thay đổi trạng thái riêng biệt (ví dụ: các thay đổi nhị phân trong quá trình bật và tắt nguồn). Do bản chất của tính năng riêng biệt, 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 xúc giác cho mỗi sự kiện đầu vào).

Android hướng đến việc cung cấp 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 ồn ào hoặc nhòe.

Các hằng số xúc giác được xác định trước được tạo để hỗ trợ 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 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 tính năng phản hồi xúc giác trong hệ sinh thái Android. Hãy sử dụng danh sách kiểm tra cơ bản, quy trình đánh giá phần cứngCDD để tìm hiểu thêm về cách triển khai tính năng phản hồi xúc giác.

Nhấn và thả

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

Hiệu ứng xúc giác phong phú

Tính năng cảm ứng đa dạng là một danh mục cảm ứng đang phát triển, vượt ra ngoài các hiệu ứng dựa trên xung đơn. Android hướng đến việc hỗ trợ tính năng haptics 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ảm giác chạm đa dạng 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 haptics đượ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 haptics ảo), thì hiệu ứng haptics lặp lại nên rõ ràng và tinh tế.

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

Nếu biên độ không đủ tinh tế, thì năng lượng xúc giác được cảm nhận sẽ tích luỹ qua quá trình lặp lại, dẫn đến cảm giác xúc giác mạnh mẽ ở 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 soạn một thiết kế bằng cách nối các trình tự PRIMITIVE_CLICKPRIMITIVE_TICK trong VibrationEffect.Composition. Bạn có thể điều chỉnh các đặc điểm của độ lặp lại và thang độ biên độ bằng addPrimitive(int primitiveID, float scale, int delay). Hỗ trợ dựa trên 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 lâu với hiệu ứng dễ chịu

Rung dài là một rung động biên độ mượt mà chuyển đổi từ 0 đến biên độ mục tiêu. Độ rung dài có thể tạo ra phản hồi xúc giác chú ý có thể nhận biết được. Tuy nhiên, một rung động 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 ù. Để tạo ra một độ rung dài dễ chịu hơn, hãy áp dụng hiệu ứng dễ dàng ở đầu độ rung dài. Điều 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 dễ dàng

  1. Kiểm tra chức năng điều khiển biên độ của phần cứng bằng android.os.Vibrator.hasAmplitudeControl().

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

  3. Điều chỉnh chuỗi timings[]amplitudes[] để tạo ra đường cong chuyển động từ từ, như minh hoạ trong Hình 5.

Rung lâu

Hình 5. Đường cong tăng dần cho chế độ rung dài.

Trường hợp sử dụng 3: Cảm ứng haptics kết hợp với âm thanh

Cảm ứng kết hợp với âm thanh là các mẫu cảm ứng kết hợp với nhịp độ của âm thanh để thu hút sự chú ý của người dùng.

Hiệu ứng haptics kết hợp với âm thanh: Lợi ích

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

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

Cặp âm thanh

Hình 6. Ví dụ về phản hồi xúc giác kết hợp âm thanh.

Cảm ứng âm thanh: Mẹo triển khai

Để triển khai tính năng haptics 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 qua cả kênh âm thanh và kênh haptics. Hãy lưu ý những điều sau:

  • Sử dụng các lớp MediaPlayer hoặc SoundPool.

    • Các thành phần ở định dạng OGG có khoá siêu dữ liệu đặc biệt (ANDROID_HAPTIC, theo sau là một số kênh haptics) cho biết có dữ liệu haptics và phát bằng MediaPlayerSoundPool.
  • Cho biết tính 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 với kênh haptics (hiệu ứng 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 haptics (hiệu ứng 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 với phản hồi và phản hồi xúc giác đồng bộ.
  • HAL của bộ rung phải triển khai tính năng hỗ trợ điều khiển bên ngoài.

Hiệu ứng xúc giác kết hợp với âm thanh

Hình 7. Triển khai tính năng 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 cảm giác 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 của Trình tạo hiệu ứng xúc giác

Hình 8. Cấu trúc của Trình tạo hiệu ứng xúc giác.

Hình ảnh trực quan về cấu trúc này cho thấy vị trí của Trình tạo phản hồi xúc giác được áp dụng cho luồng âm thanh đến của người dùng trước khi luồng này được gửi đến Audio HAL. Trình tạo được áp dụng sau khi AudioMixer phân tách dữ liệu âm thanh và dữ liệu xúc giác, trước khi có hiệu ứng âm thanh nào khác và đầu ra của trình tạo 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 của bạn 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 độ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 á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ố đó theo thông số kỹ thuật phần cứng của bạn.

  • Tần số cộng hưởng cho bộ lọc thông băng tần

    Tần số cộng hưởng của bộ rung là tần số mà một bộ truyền động xúc giác có đầu ra tối đa. Tham số này điều chỉnh bộ chống cộng hưởng để làm phẳng một phần hàm truyền đáp ứng, nhằm có được băng thông rộng hơn. Khung Android tự động liên kết giá trị này với đầu ra của phương thức HAL của bộ rung 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 hệ số mũ trong quá trình chuẩn hoá một phần (tự động điều khiển độ lợi). Giá trị mặc định của tham số này là -0,8, tức là 80% biến động phạm vi động sẽ bị loại bỏ bằng bước kiểm soát độ lợi này. Bạn có thể sửa đổi thông tin này trong .

  • Hệ số Q cho bộ lọc chặn dải tần

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

    • Zero Q, hệ số chất lượng của các số không trong bộ lọc chặn dải tần giúp triệt tiêu một phần độ cộng hưởng

    • Q cực, hệ số chất lượng của các cực trong bộ lọc chặn dải 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ụ: giá trị mặc định là 8 cho Q rỗng và 4 cho Q cực tạo ra tỷ lệ 2, giới hạn độ 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 của bộ rung IVibrator.getQFactor.

    Nếu các giá trị mặc định không tính đến việc giảm cường độ độ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 cả hai hoặc giảm cả hai. Tỷ lệ Q rỗng với Q cực 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 giảm độ rung ở cấp thấp và tăng cường các cấp cao hơn bằng cách sử dụng độ méo hình lập phương. Giá trị mặc định là 300 Hz. Bạn có thể sửa đổi giá trị này trong .

  • Mức tăng đầu vào và ngưỡng khối lập phương để làm méo

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

    • Giá trị mặc định của hệ số tăng đầu vào là 0,3.
    • Giá trị mặc định cho ngưỡng khối lập phương 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 giá trị này trong .

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

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

  • Mức tăng đầu ra cho độ méo

    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 khi bộ giới hạn mềm giới hạn biên độ rung ở mức dưới 1. Giá trị mặc định của thuộc tính này 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 có thể nghe thấy tiếng lắc của phần cứng bộ truyền động, hãy giảm giá trị này.