Các bộ truyền động rung phổ biến nhất trên thiết bị Android là bộ truyền động cộng hưởng tuyến tính (LRA). LRA mô phỏng cảm giác nhấp vào nút trên một bề mặt kính không phản hồi. Tín hiệu phản hồi lượt nhấp rõ ràng và sắc nét thường kéo dài từ 10 đến 20 mili giây. Cảm giác này giúp người dùng tương tác một cách tự nhiên hơn. Đối với bàn phím ảo, phản hồi lượt nhấp này có thể tăng tốc độ nhập và giảm lỗi.
LRA có một vài tần số cộng hưởng phổ biến:
- Một số LRA có tần số cộng hưởng trong khoảng từ 200 đến 300 Hz, trùng khớp với tần số mà da người nhạy cảm nhất với độ rung. Cảm giác rung ở dải tần số này thường được mô tả là mượt mà, sắc nét và xuyên thấu.
- Các mẫu LRA khác có tần số cộng hưởng thấp hơn, khoảng 150 Hz. Cảm giác về chất lượng mềm hơn và đầy đặn hơn (theo chiều).
Với cùng một điện áp đầu vào ở hai tần số khác nhau, biên độ đầu ra của độ rung có thể khác nhau. Tần số càng xa tần số cộng hưởng của LRA, biên độ dao động càng thấp.
Hiệu ứng xúc giác của một thiết bị cụ thể sử dụng cả bộ truyền động rung và trình điều khiển của bộ truyền động đó. Trình điều khiển haptics có các tính năng tăng tốc và phanh chủ động có thể giảm thời gian tăng và độ rung của LRA, giúp độ rung rõ ràng và nhạy hơn.
Gia tốc đầu ra của bộ rung
Bản đồ tần số-tốc độ tăng tốc đầu ra (FOAM) mô tả tốc độ tăng tốc đầu ra tối đa có thể đạt được (tính bằng G đỉnh) ở một tần số rung nhất định (tính bằng Hertz). Kể từ Android 16 (API cấp 36), nền tảng này sẽ tích hợp tính năng hỗ trợ cho việc liên kết này thông qua VibratorFrequencyProfile
. Bạn có thể sử dụng lớp này cùng với các API phong bì cơ bản và nâng cao để tạo hiệu ứng xúc giác.
Hầu hết động cơ LRA đều có một đỉnh duy nhất trong FOAM, thường là gần tần số cộng hưởng. Gia tốc thường giảm theo hàm mũ khi tần số sai lệch khỏi phạm vi này. Đường cong có thể không đối xứng và có thể có một vùng phẳng quanh tần số cộng hưởng để bảo vệ động cơ khỏi bị hư hỏng.
Biểu đồ bên cạnh cho thấy một ví dụ về FOAM cho động cơ LRA.
Ngưỡng phát hiện nhận thức của con người
Ngưỡng phát hiện cảm nhận của con người đề cập đến gia tốc tối thiểu của một dao động mà một người có thể phát hiện một cách đáng tin cậy. Mức này thay đổi tuỳ theo tần suất rung.
Biểu đồ bên cạnh cho thấy ngưỡng phát hiện cảm nhận xúc giác của con người, tính theo gia tốc, dưới dạng hàm tần số thời gian. Dữ liệu ngưỡng được chuyển đổi từ ngưỡng dịch chuyển trong Hình 1 của Bolanowski Jr., S. Bài viết năm 1988 của J., et al., "Bốn kênh điều tiết các khía cạnh cơ học của cảm ứng".
Android tự động xử lý ngưỡng này trong BasicEnvelopeBuilder
, xác minh rằng tất cả các hiệu ứng đều sử dụng phạm vi tần số tạo ra biên độ rung vượt quá ngưỡng phát hiện nhận thức của con người ít nhất là 10 dB.
Một hướng dẫn trực tuyến giải thích thêm về quy trình chuyển đổi giữa biên độ gia tốc và biên độ dịch chuyển.
Mức độ tăng tốc rung
Nhận thức của con người về cường độ rung, một phép đo nhận thức, không tăng lên một cách tuyến tính với biên độ rung, một tham số vật lý. Cường độ cảm nhận được đặc trưng bằng mức độ cảm giác (SL), được xác định là một lượng dB cao hơn ngưỡng phát hiện ở cùng tần số.
Bạn có thể tính toán biên độ gia tốc rung tương ứng (tính bằng G đỉnh) như sau:
...trong đó dB biên độ là tổng của SL và ngưỡng phát hiện – giá trị dọc theo trục dọc trong biểu đồ liền kề – ở một tần số cụ thể.
Biểu đồ bên cạnh cho thấy các mức gia tốc rung ở 10, 20, 30, 40 và 50 dB SL, cùng với ngưỡng phát hiện cảm nhận xúc giác của con người (0 dB SL), dưới dạng hàm của tần số thời gian. Dữ liệu được ước tính từ Hình 8 trong bài viết của Verrillo, R. Bài viết năm 1969 của T., et al., "Mức độ cảm giác của các kích thích rung xúc giác.".
Android tự động xử lý việc chuyển đổi này trong BasicEnvelopeBuilder
, lấy các giá trị dưới dạng cường độ chuẩn hoá trong không gian mức độ cảm giác (dB SL) và chuyển đổi các giá trị đó thành gia tốc đầu ra. Mặt khác, WaveformEnvelopeBuilder
không áp dụng phép chuyển đổi này và lấy các giá trị dưới dạng biên độ gia tốc đầu ra đã chuẩn hoá trong không gian gia tốc (G). API bao bì giả định rằng khi nhà thiết kế hoặc nhà phát triển nghĩ về những thay đổi về cường độ rung, họ mong đợi cường độ cảm nhận được sẽ tuân theo một bao bì tuyến tính theo từng phần.
Làm mượt dạng sóng mặc định trên thiết bị
Để minh hoạ, hãy xem xét cách hoạt động của mẫu dạng sóng tuỳ chỉnh trên một thiết bị chung:
Kotlin
val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
Các biểu đồ sau đây cho thấy dạng sóng đầu vào và gia tốc đầu ra tương ứng với các đoạn mã trước đó. Lưu ý rằng gia tốc tăng dần, chứ không đột ngột, bất cứ khi nào có sự thay đổi bước của biên độ trong mẫu, tức là tại 0 mili giây, 150 mili giây, 200 mili giây, 250 mili giây và 700 mili giây. Ngoài ra, còn có hiện tượng vượt quá ở mỗi bước thay đổi biên độ và có hiện tượng rung rõ ràng kéo dài ít nhất 50 mili giây khi biên độ đầu vào đột ngột giảm xuống 0.
Cải thiện mẫu haptics
Để tránh vượt quá và giảm thời gian đổ chuông, hãy thay đổi biên độ một cách từ từ hơn. Sau đây là đồ thị dạng sóng và gia tốc của phiên bản sửa đổi:
Kotlin
val timings: LongArray = longArrayOf(
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Do not repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] {
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
};
int[] amplitudes = new int[] {
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
};
int repeatIndex = -1; // Do not repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
Tạo hiệu ứng xúc giác phức tạp hơn
Các thành phần khác trong phản hồi nhấp chuột thoả đáng phức tạp hơn, đòi hỏi một số kiến thức về LRA được sử dụng trong thiết bị. Để có kết quả tốt nhất, hãy sử dụng sóng được tạo sẵn và hằng số do nền tảng cung cấp của thiết bị. Điều này cho phép bạn làm những việc sau:
- Thực hiện các hiệu ứng rõ ràng và mẫu gốc.
- Kết hợp các hiệu ứng này để tạo hiệu ứng xúc giác mới.
Các hằng số và nguyên hàm xúc giác được xác định trước này có thể giúp bạn tăng tốc đáng kể trong khi tạo hiệu ứng xúc giác chất lượng cao.