Bộ truyền động rung phổ biến nhất trên các 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 khi nhấp vào nút trên bề mặt kính không phản hồi. Tín hiệu phản hồi rõ ràng và sắc nét khi nhấp thường kéo dài từ 10 đến 20 mili giây. Cảm giác này giúp các hoạt động tương tác của người dùng trở nên tự nhiên hơn. Đối với bàn phím ảo, phản hồi khi nhấp này có thể tăng tốc độ nhập và giảm lỗi.
LRA có một số tần số cộng hưởng thường gặp:
- Một số LRA có tần số cộng hưởng trong khoảng từ 200 đến 300 Hz, trùng với tần số mà da người nhạy cảm nhất với rung động. Cảm giác rung ở dải tần số này thường được mô tả là êm ái, 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 rung động mềm mại và đầy đặn hơn (về kích thước).
Với cùng một điện áp đầu vào ở hai tần số khác nhau, biên độ đầu ra rung có thể khác nhau. Tần số càng khác với tần số cộng hưởng của LRA, biên độ rung của tần số đó càng thấp.
Hiệu ứng xúc giác của một thiết bị nhất định 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 xúc giác 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, dẫn đến độ rung rõ ràng và phản hồi nhanh hơn.
Tăng tốc độ đầu ra của bộ rung
Ánh xạ tần số sang gia tốc đầu ra (FOAM) mô tả gia tốc đầu ra tối đa có thể đạt được (tính bằng G đỉnh) ở một tần số rung động nhất định (tính bằng Hertz). Kể từ Android 16 (cấp độ API 36), nền tảng này cung cấp tính năng hỗ trợ tích hợp cho hoạt động ánh xạ 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 các độ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. Nhìn chung, gia tốc giảm theo hàm mũ khi tần số lệch khỏi phạm vi này. Đường cong này có thể không đối xứng và có thể có một đoạn bằng phẳng xung 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 mức gia tốc tối thiểu của một rung độ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 số 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, theo gia tốc, như một hàm của 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. J., và cộng sự, bài viết năm 1988, "Bốn kênh điều chỉnh các khía cạnh cơ học của xúc giác".
Android tự động xử lý ngưỡng này trong BasicEnvelopeBuilder, giúp xác minh rằng tất cả hiệu ứng đều sử dụng một dải tần số tạo ra biên độ rung vượt quá ngưỡng phát hiện cảm nhận của con người ít nhất 10 dB.
Một hướng dẫn trực tuyến giải thích thêm về mối quan hệ giữa biên độ gia tốc và biên độ độ dịch chuyển.
Mức độ gia tốc rung
Cảm nhận của con người về cường độ rung, một thước đo cảm nhận, không tăng tuyến tính theo biên độ rung, một tham số vật lý. Cường độ cảm nhận được đặc trưng bởi mức độ cảm giác (SL), được xác định là lượng dB trê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 động 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 tung trong biểu đồ liền kề – ở một tần số cụ thể.
Biểu đồ bên cạnh cho thấy 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 một hàm của tần số tạm thời. Dữ liệu được ước tính từ Hình 8 trong Verrillo, R. T., và cộng sự, bài viết năm 1969, "Sensation magnitude of vibrotactile stimuli" (Cường độ cảm giác của các kích thích rung xúc giác).
Android tự động xử lý quá trình chuyển đổi này trong BasicEnvelopeBuilder, lấy các giá trị làm cường độ được chuẩn hoá trong không gian mức độ cảm nhận (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 lượt chuyển đổi này và lấy các giá trị làm biên độ gia tốc đầu ra được chuẩn hoá trong không gian gia tốc (Gs). API phong 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 phong bì tuyến tính từng phần.
Tính năng 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ột 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 đó. Xin lưu ý rằng gia tốc tăng dần chứ không tăng đột ngột, bất cứ khi nào có sự thay đổi về biên độ trong mẫu hình, tức là ở 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 xúc giác
Để tránh vượt quá và giảm thời gian rung, hãy thay đổi biên độ dần dần hơn. Sau đây là dạng sóng và biểu đồ 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 phần tử khác trong một phản hồi nhấp chuột thoả mãn sẽ phức tạp hơn, đòi hỏi bạn phải có kiến thức về LRA được dùng trong một thiết bị. Để có kết quả tốt nhất, hãy sử dụng các hằng số do nền tảng cung cấp và dạng sóng được tạo sẵn của thiết bị. Nhờ đó, bạn có thể làm những việc sau:
- Thực hiện các hiệu ứng và nguyên hàm rõ ràng.
- Nối các mẫu này để tạo hiệu ứng xúc giác mới.
Các hằng số và thành phần haptic xác định trước này có thể giúp bạn tăng tốc đáng kể quá trình tạo hiệu ứng haptic chất lượng cao.