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ú .
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 |
| Trước năm 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.View |
| Trước năm 2016 |
android.os.Vibrator |
| Trước năm 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.os.VibrationEffect |
| 2017 (Android 8) |
| 2019 (Android 10) | |
android.os.VibrationEffect.Composition |
| 2020 (Android 11) |
android.media.AudioAttributes.Builder |
| 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ứng và CDD . để tìm hiểu thêm về triển khai xúc giác.
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.
Hình 4. Cảm xúc phong phú với kết cấu trượ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_TICK
và TEXT_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_CLICK
và PRIMITIVE_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
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.
- Kết quả phải
Sử dụng
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Điều chỉnh chuỗi
timings[]
vàamplitudes[]
để tạo ra đường cong dễ in, như thể hiện trong Hình 6.
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.
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ặcSoundPool
.- 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ằngMediaPlayer
vàSoundPool
.
- Nội dung ở định dạng OGG có khóa siêu dữ liệu đặc biệt (
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
- Sử dụng cấu hình đầu ra với kênh
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ộ.
- Theo mặc định, các kênh xúc giác bị tắt tiếng (
Vibrator HAL phải thực hiện hỗ trợ điều khiển bên ngoài.
- Đối với triển khai HIDL , sử dụng
setExternalControl(bool enabled) generates (Status status)
. - Để triển khai AIDL , hãy sử dụng
void setExternalControl(in boolean enabled)
.
- Đối với triển khai HIDL , sử dụng
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.
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.
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 .
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 .
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 .
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 .
Độ 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.
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ị.