Nền tảng UX cho khung xúc giác

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

Nguyên tắc UX

Hình 1. Nguyên tắc hiện tại

Bảng sau liệt kê tất cả các API haptics có sẵn.

API Phương pháp Năm được thêm vào
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)
  • XÁC NHẬN
  • TỪ CHỐI
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performanceHapticFeedback ()
Trước năm 2016
android.os.Vibrator
  • rung()
  • hasVibrator ()
Trước năm 2016
  • hasAmpinityControl ()
2017 (Android 8)
  • areAllEffectsSupported ()
  • areAllPrimistsSupported ()
  • areEffectsSupported ()
  • arePrimitiveSupported ()
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 ()
  • soạn, biên soạn()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted ()
2019 (Android 10)

Rung động

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

Rõ ràng haptics

Rõ ràng haptics hỗ trợ cảm giác thay đổi trạng thái rời rạc (ví dụ: thay đổi nhị phân trong quá trình bật / tắt nguồn). Do bản chất của khả năng chi trả rời rạc , haptics rõ ràng được tạo ra như 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 nhằm mục đích mang lại những cảm giác rõ ràng với những cảm giác mạnh mẽ nhưng sắc nét hơn là những cảm giác rối rắm hoặc ủy mị.

Các hằng số xúc giác xác định trước được tạo ra để hỗ trợ cảm giác xúc giác rõ ràng bao gồm những điều sau đây.

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

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à chìa khóa để nâng cao chất lượng tổng thể của haptics 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ề triển khai xúc giác.

Báo chí và phát hành

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

Haptics phong phú

Rich haptics là một danh mục haptics đang phát triển vượt ra ngoài các hiệu ứng dựa trên xung lực đơn lẻ. Android nhằm mục đích hỗ trợ các tác phẩm phong phú với khả năng tổng hợp và khả năng điều chỉnh cao với mức độ chi tiết tốt. Các trường hợp sử dụng sau được hỗ trợ trong Android 11 trở xuống.

Haptics phong phú

Hình 4. Cảm xúc phong phú với kết cấu trượt

Kéo và vuốt

Hình 5. 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 với kết cấu xúc giác ảo), thì hiệu ứng xúc giác lặp lại tốt hơn là sắc nét và tinh tế.

Nếu hiệu ứng riêng lẻ bị mờ hơn là rõ nét, thì khoảng thời gian giữa các lần lặp lại có thể bị xóa bỏ. Kết quả là một buzz 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 sự lặp lại, dẫn đến xúc giác mạnh áp đảo ở cuối lần lặp lại.

Triển khai kết cấu xúc giác bề mặt đơn giản cho các 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 tính của sự 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 xâu chuỗi các chuỗi PRIMITIVE_CLICKPRIMITIVE_TICK lại với nhau trong VibrationEffect.Composition . Bạn có thể điều chỉnh các đặc điểm của tỷ lệ lặp lại và biên độ bằng addPrimitive(int primitiveID, float scale, int delay) . Hỗ trợ dựa vào khả năng CAP_COMPOSE_EFFECTS của Giao diện Vibrator HAL .

Trường hợp sử dụng 2: Rung lâu với hiệu ứng dễ dàng

Dao động dài là dao động biên độ trơn chuyển từ biên độ 0 đến biên độ mục tiêu. Rung động lâu có thể dễ dàng tạo ra cảm giác hưng phấn do chú ý. Tuy nhiên, rung động đột ngột trong thời gian dài 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 vo ve có thể nghe được. Để tạo ra một rung động dài dễ chịu hơn, hãy áp dụng hiệu ứng dễ dàng khi bắt đầu rung động dài. Điều này tạo ra sự chuyển đổi biên độ mượt mà hướng tới biên độ mục tiêu.

Áp dụng hiệu ứng dễ dàng

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

    • Kết quả phải true để tạo ra 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 dễ in, như thể hiện trong Hình 6.

Rung lâu

Hình 6. Đường cong dễ rung động dài

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

Âm thanh kết hợp với xúc giác là các mẫu 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.

Hptics kết hợp âm thanh: Lợi ích

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

Điều quan trọng là phải xem xét các mô hình nhịp điệu cảm giác. Nếu không có cảm giác về nhịp điệu, người dùng coi các cảm giác xúc giác là những tiếng vo ve ngẫu nhiên và có xu hướng bỏ qua chúng.

Cặp đôi âm thanh

Hình 7. Ví dụ về cặp đôi âm thanh haptics

Kỹ thuật haptics kết hợp âm thanh: Mẹo triển khai

Việc triển khai haptics kết hợp âm thanh yêu cầu hiểu biết cơ bản về phát lại nội dung của cả kênh âm thanh và kênh xúc giác. Hãy ghi nhớ những điều sau đây.

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

    • Nội dung ở định dạng OGG có khóa 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 haptics và phát lại bằng MediaPlayerSoundPool .
  • Cho biết hỗ trợ haptics và phát lại âm thanh trong audio_policy_configuration.xml .

    • Sử dụng cấu hình đầu ra với kênh 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.

    Thí dụ

    Nếu mặt nạ kênh cho luồng đầu ra trông giống như sau:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    Sau đó, mọi mẫu sẽ giống như thế này:

    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 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à xúc giác đồng bộ.
  • Vibrator HAL phải thực hiện hỗ trợ điều khiển bên ngoài.

Âm thanh được ghép nối Haptics

Hình 8. Triển khai haptics kết hợp âm thanh

Âm thanh kết hợp với haptics: Haptic Generator

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

Haptic Generator architecture

Hình 9. Kiến trúc Haptic Generator

Để đảm bảo thuật toán tạo cảm giác xúc giác của bạn tạo ra cảm giác xúc giác chất lượng cao, hãy điều chỉnh thuật toán tạo cảm ứng cho động cơ máy rung của thiết bị bằng cách điều chỉnh các thông 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 thông số này và giải thích cách điều chỉnh chúng theo đặc điểm kỹ thuật phần cứng của bạn.

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

    Tần số cộng hưởng của bộ rung là tần số tại đó bộ truyền động xúc giác có công suất cực đại. 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 chức năng truyền phản hồi, để có được băng thông rộng hơn. Khung công tác Android tự động liên kết giá trị này với đầu ra của phương pháp Vibrator HAL IVibrator.getResonantFrequency .

    Giá trị mặc định cho tham số này là 150Hz . Điều này có thể được sửa đổi trong mã ở đây .

  2. Sức mạnh chuẩn hóa cho phong bì chậm

    Tham số này xác định số mũ trong chuẩn hóa từng phần (điều khiển độ lợi tự động). Giá trị mặc định của nó là -0,8 , có nghĩa là 80% biến thể dải động bị loại bỏ bởi bước kiểm soát độ lợi này. Điều này có thể được sửa đổi trong mã ở đây .

  3. Hệ số Q cho bộ lọc dải dừng

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

    • Zero Q, hệ số chất lượng của các số không trong bộ lọc dải tần loại bỏ một phần cộng hưởng.

    • Cực Q, hệ số chất lượng của các cực trong bộ lọc 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 ứng thuật toán. Ví dụ, các giá trị mặc định là 8 cho Zero Q và 4 cho Cực Q tạo ra tỷ lệ 2 , hạn chế sự triệt tiêu cộng hưởng bằng hệ số 2 (6 dB). Khung Android liên kết cả hai giá trị với đầu ra của phương pháp Vibrator HAL IVibrator.getQFactor .

    Nếu các giá trị mặc định không giải thích cho việc giảm độ bền động cơ trong thiết bị của bạn, chúng tôi khuyên bạn nên sửa đổi cả hai giá trị cùng một lúc và tăng hoặc giảm cả hai. Tỷ lệ giữa Zero Q và Pole Q phải lớn hơn 1 . Điều này có thể được sửa đổi trong mã ở đây .

  4. Tần số góc để biến dạng

    Tần số góc được áp dụng bởi bộ lọc thông thấp giúp triệt tiêu độ rung ở mức thấp và nâng cao mức cao hơn bằng cách sử dụng biến dạng khối. Nó mặc định là 300Hz . Điều này có thể được sửa đổi trong mã ở đây .

  5. Độ lợi đầu vào và ngưỡng khối lập phương đối với sự biến dạng

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

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

    Chúng tôi khuyên bạn nên sửa đổi cả hai giá trị cùng nhau. Chúng có thể được tìm thấy trong mã ở đây .

    Để biết thêm thông tin về chức năng được áp dụng bởi bộ lọc này, hãy tham khảo cách triển khai có sẵn tại đây . Để tìm hiểu thêm về cách hai thông số này ảnh hưởng đến đầu ra, chúng tôi khuyên bạn nên vẽ biểu đồ tần số phản hồi của bộ lọc và quan sát cách đáp ứng tần số thay đổi với các giá trị thông số khác nhau.

  6. Tăng đầu ra cho sự biến dạng

    Tham số này kiểm soát biên độ rung động cuối cùng. Đó là mức tăng cuối cùng được áp dụng sau một bộ giới hạn mềm giới hạn biên độ dao động nhỏ hơn 1. Giá trị mặc định của nó là 1,5 và nó có thể được sửa đổi trong mã tại đây . Nếu rung động quá nhỏ, hãy tăng giá trị. Nếu bạn có thể nghe thấy tiếng kêu lục cục của phần cứng bộ truyền động, hãy giảm giá trị.