Tài liệu tham khảo API xúc giác của Android

Phần này giới thiệu về nhiều API haptics có trong Android. Tài liệu này cũng đề cập đến thời điểm và cách kiểm tra mọi tính năng hỗ trợ thiết bị cần thiết để đảm bảo hiệu ứng xúc giác của bạn phát đúng như dự kiến.

Có một số cách để tạo hiệu ứng xúc giác và điều quan trọng là bạn phải cân nhắc nguyên tắc thiết kế của hiệu ứng xúc giác trên Android khi chọn trong số các cách đó. Bảng sau đây tóm tắt các thuộc tính cấp cao này của từng phương pháp:

  • Khả năng sử dụng đặc biệt quan trọng khi lập kế hoạch dự phòng hành vi và cần được kết hợp với việc kiểm tra khả năng hỗ trợ của từng thiết bị.
  • Cảm ứng rõ ràng là cảm giác sắc nét và rõ ràng, ít gây khó chịu cho người dùng.
  • Cảm ứng đa dạng có khả năng biểu đạt cao hơn và thường yêu cầu phần cứng có nhiều tính năng hơn.
Nền tảng API Phạm vi cung cấp Xoá phản hồi xúc giác Hiệu ứng xúc giác đa dạng
HapticFeedbackConstants Android 1.5 trở lên
(trên mỗi hằng số)
VibrationEffect được xác định trước Android 10 trở lên
Cấu trúc VibrationEffect Android 11 trở lên (theo hằng số)
Chế độ rung bật/tắt, một lần và dạng sóng Android 1

Ngoài ra, API thông báo được mô tả trên trang này cho phép bạn tuỳ chỉnh hiệu ứng xúc giác phát cho thông báo đến.

Ngoài ra, trang này còn mô tả các khái niệm bổ sung trên các nền tảng API:

HapticFeedbackConstants

Lớp HapticFeedbackConstants cung cấp các hằng số dựa trên hành động để cho phép ứng dụng thêm phản hồi xúc giác nhất quán trên trải nghiệm thiết bị, thay vì mỗi ứng dụng có các hiệu ứng khác nhau cho các thao tác phổ biến.

Khả năng tương thích và yêu cầu

Việc sử dụng phương thức View.performHapticFeedback với các hằng số này không yêu cầu bất kỳ quyền đặc biệt nào cho ứng dụng. Phương thức này tuân theo thuộc tính View.hapticFeedbackEnabled. Nếu bạn đặt thuộc tính này thành false, thì tất cả các lệnh gọi phản hồi xúc giác trên thành phần hiển thị, bao gồm cả các lệnh gọi mặc định, sẽ bị tắt. Chế độ cài đặt liên quan chính là thuộc tính View.hapticFeedbackEnabled. Nếu bạn đặt thuộc tính này thành false, thì tất cả các lệnh gọi phản hồi xúc giác trên thành phần hiển thị, bao gồm cả các lệnh gọi mặc định, sẽ bị tắt. Phương thức này cũng tuân theo chế độ cài đặt hệ thống của người dùng để bật tính năng phản hồi thao tác chạm.

Điểm cần cân nhắc duy nhất về khả năng tương thích là cấp độ SDK của hằng số cụ thể cho thao tác.

Bạn không cần cung cấp hành vi dự phòng khi sử dụng HapticFeedbackConstants.

Cách sử dụng HapticsFeedbackConstants

Để biết thông tin chi tiết về cách sử dụng HapticFeedbackConstants, hãy xem phần Thêm phản hồi xúc giác vào sự kiện.

VibrationEffect được xác định trước

Lớp VibrationEffect cung cấp một số hằng số được xác định trước như CLICK, TICKDOUBLE_CLICK. Các hiệu ứng này có thể được tối ưu hoá cho thiết bị.

Khả năng tương thích và yêu cầu

Để phát bất kỳ VibrationEffect nào, bạn cần có quyền VIBRATE trong tệp kê khai ứng dụng.

Bạn không cần cung cấp hành vi dự phòng khi sử dụng VibrationEffect được xác định trước, vì các hằng số không có phương thức triển khai được tối ưu hoá cho thiết bị sẽ quay lại phương thức dự phòng tiêu chuẩn của nền tảng.

API Vibrator.areEffectsSupportedVibrator.areAllEffectsSupported dùng để xác định xem có cách triển khai được tối ưu hoá cho thiết bị hay không. Bạn vẫn có thể sử dụng các hiệu ứng được xác định trước mà không cần triển khai tối ưu hoá và sử dụng phương thức dự phòng tiêu chuẩn của nền tảng. Do đó, bạn chỉ cần các API areEffectsSupported này nếu ứng dụng muốn xem xét liệu hiệu ứng có được tối ưu hoá cho thiết bị hay không.

Các phương thức kiểm tra hiệu ứng có thể trả về một trong ba giá trị:

  • VIBRATION_EFFECT_SUPPORT_YES cho biết rằng thiết bị đã tối ưu hoá khả năng hỗ trợ hiệu ứng này.
  • VIBRATION_EFFECT_SUPPORT_NO cho biết thiết bị không có tính năng hỗ trợ được tối ưu hoá, nhưng vẫn sử dụng phương thức dự phòng của nền tảng.
  • VIBRATION_EFFECT_SUPPORT_UNKNOWN cho biết hệ thống không biết liệu quá trình triển khai có được tối ưu hoá hay không.

Vì giá trị UNKNOWN cho biết API kiểm tra không có sẵn, nên giá trị này thường được trả về cho tất cả các hiệu ứng hoặc không có hiệu ứng nào. Các thiết bị này sẽ tự động chuyển sang chế độ dự phòng.

Cách sử dụng VibrationEffect được xác định trước

Để biết thông tin chi tiết về cách sử dụng VibrationEffect được xác định trước, hãy xem phần Sử dụng VibrationEffect được xác định trước để tạo phản hồi xúc giác.

Cấu trúc VibrationEffect

Cấu trúc VibrationEffect là một hiệu ứng rung được tạo bằng API VibrationEffect.startComposition. API này cho phép tính năng cảm ứng đa dạng biểu cảm bằng cách tạo một chuỗi các thành phần gốc có độ trễ và cường độ tuỳ chỉnh. Tuy nhiên, hãy đặc biệt chú ý để đảm bảo rằng thiết bị hỗ trợ các tính năng đang được kết hợp để tránh trải nghiệm tổng thể không nhất quán.

Khả năng tương thích và yêu cầu

Để phát bất kỳ VibrationEffect nào, bạn cần có quyền VIBRATE trong tệp kê khai ứng dụng.

Không phải thiết bị nào cũng hỗ trợ tất cả tính năng của API thành phần, vì vậy, điều quan trọng là phải đảm bảo có sẵn các thành phần gốc.

Kiểm tra tính năng hỗ trợ rung nguyên gốc

Bạn có thể truy xuất tính năng hỗ trợ cho mỗi đối tượng gốc bằng cách sử dụng phương thức Vibrator.arePrimitivesSupported. Ngoài ra, bạn có thể kiểm tra cùng một lúc một tập hợp các đối tượng gốc bằng cách sử dụng phương thức Vibrator.areAllPrimitivesSupported. Thao tác này tương đương với việc AND hỗ trợ cho mỗi đối tượng gốc.

Cách sử dụng thành phần VibrationEffect

Để biết thông tin chi tiết về cách sử dụng các thành phần VibrationEffect, hãy xem phần Tạo thành phần rung.

Chế độ rung bật/tắt, một lần và dạng sóng

Hình thức rung lâu đời nhất được hỗ trợ trên Android là các mẫu bật/tắt rung đơn giản với thời lượng có thể định cấu hình. Các API này thường không phù hợp với Nguyên tắc thiết kế haptics vì chúng có thể tạo ra haptics ồn ào; hãy tránh sử dụng các API này trừ phi không còn cách nào khác.

Trường hợp sử dụng phổ biến nhất cho chế độ rung bật/tắt là thông báo, trong đó, bất kể điều gì, bạn đều muốn có một số chế độ rung. Chế độ rung dạng sóng cũng cho phép lặp lại một mẫu vô thời hạn, như bạn có thể tưởng tượng đối với một nhạc chuông.

Mẫu một lần đề cập đến việc rung một lần trong N mili giây.

Có hai loại mẫu dạng sóng:

  • Chỉ có thời gian. Loại dạng sóng này là nội dung mô tả về thời lượng bật và tắt luân phiên. Thời gian bắt đầu bằng thời lượng tắt. Do đó, các mẫu dạng sóng thường bắt đầu bằng giá trị 0 để cho biết ngay lập tức bắt đầu rung.
  • Thời gian và biên độ. Loại dạng sóng này có thêm một mảng biên độ để khớp với từng hình ảnh thời gian, thay vì trạng thái bật/tắt ngầm ẩn của dạng sóng đầu tiên. Tuy nhiên, điều quan trọng là phải kiểm tra để đảm bảo thiết bị hỗ trợ tính năng kiểm soát biên độ nhằm đảm bảo có thể đạt được tỷ lệ theo dự kiến.

Khả năng tương thích và yêu cầu

Vì chế độ rung bật/tắt là hình thức rung lâu đời nhất, nên các chế độ này được hỗ trợ trên hầu hết các thiết bị có bộ rung, như mô tả ở phần sau trên trang này.

Việc phát bất kỳ lệnh gọi VibrationEffect hoặc vibrate kiểu cũ nào đều yêu cầu quyền VIBRATE trong tệp kê khai ứng dụng.

Khi sử dụng nhiều giá trị biên độ trong một dạng sóng, bạn nên đảm bảo rằng thiết bị hỗ trợ tính năng kiểm soát biên độ.

Kiểm tra xem có hỗ trợ điều khiển biên độ hay không

Các giá trị biên độ khác 0 được làm tròn lên 100% trên các thiết bị không có chức năng kiểm soát biên độ. Vì vậy, điều quan trọng là phải kiểm tra xem tính năng hỗ trợ có xuất hiện hay không bằng cách sử dụng Vibrator.hasAmplitudeControl. Hãy xem phần điều khiển biên độ để biết thêm thông tin chi tiết.

Bạn nên cân nhắc kỹ xem hiệu ứng của mình có đủ chất lượng mà không cần kiểm soát biên độ hay không. Bạn nên quay lại chế độ rung bật/tắt được thiết kế rõ ràng.

Sử dụng chế độ rung bật/tắt

Ở các cấp độ SDK mới hơn, tất cả chế độ rung đều được hợp nhất thành một lớp VibrationEffect biểu cảm duy nhất, trong đó các chế độ rung đơn giản này được tạo bằng VibrationEffect.createOneshot hoặc VibrationEffect.createWaveform.

API thông báo

Khi tuỳ chỉnh thông báo ứng dụng, bạn có thể sử dụng một trong các API sau để liên kết một mẫu với từng kênh thông báo:

Tất cả các dạng này đều có mẫu dạng sóng bật/tắt cơ bản, như mô tả ở trên, trong đó mục đầu tiên là độ trễ trước khi bật trình rung.

Khái niệm chung

Một số khái niệm áp dụng trên các nền tảng API được nêu chi tiết ở trên.

Thiết bị có bộ rung không?

Bạn có thể lấy lớp Vibrator không rỗng từ context.getSystemService(Vibrator.class). Nếu thiết bị không có bộ rung, thì các lệnh gọi đến API rung sẽ không có hiệu lực. Vì vậy, ứng dụng không cần phải kiểm soát tất cả phản hồi xúc giác theo một điều kiện. Tuy nhiên, nếu cần, ứng dụng có thể gọi hasVibrator() để xác định xem đây có phải là một bộ rung thực sự (true) hay một mô-đun giả lập (false).

Người dùng có tắt tính năng phản hồi xúc giác khi chạm không?

Một số cách triển khai tuỳ chỉnh có thể yêu cầu bạn kiểm tra theo cách thủ công xem người dùng có tắt hoàn toàn chế độ cài đặt Phản hồi cảm ứng của Android hay không. Trong trường hợp này, bạn nên chặn các hiệu ứng phản hồi cảm ứng. Bạn có thể truy vấn chế độ cài đặt này bằng cách sử dụng khoá HAPTIC_FEEDBACK_ENABLED, trong đó giá trị 0 có nghĩa là tắt.

Thuộc tính rung

Bạn có thể cung cấp các thuộc tính rung (hiện ở dạng AudioAttributes) để giúp hệ thống biết mục đích của việc rung. Bạn bắt buộc phải làm việc này khi bắt đầu rung khi ứng dụng đang chạy ở chế độ nền, vì chỉ hỗ trợ tính năng haptics chú ý cho việc sử dụng ở chế độ nền.

Việc tạo AudioAttributes được đề cập trong tài liệu về lớp và nên được coi là rung thay vì âm thanh.

Để tham khảo, trong hầu hết các trường hợp, loại nội dung là CONTENT_TYPE_SONIFICATION và cách sử dụng có thể là các giá trị như USAGE_ASSISTANCE_SONIFICATION để phản hồi thao tác chạm ở nền trước hoặc USAGE_ALARM để báo thức ở chế độ nền. Cờ âm thanh không ảnh hưởng đến độ rung.

Điều khiển biên độ

Nếu có chức năng điều khiển biên độ, thì bộ rung có thể phát các chế độ rung với cường độ khác nhau. Đây là một chức năng quan trọng để tạo ra tính năng haptics phong phú, cũng như có thể cho phép người dùng kiểm soát cường độ haptics mặc định.

Bạn có thể kiểm tra tính năng hỗ trợ điều khiển biên độ bằng cách gọi Vibrator.hasAmplitudeControl. Nếu một bộ rung không hỗ trợ biên độ, thì tất cả giá trị biên độ sẽ liên kết với trạng thái tắt/bật dựa trên việc giá trị đó có bằng 0 hay không. Do đó, các ứng dụng sử dụng tính năng haptics phong phú với biên độ khác nhau nên cân nhắc tắt tính năng này nếu thiết bị thiếu chức năng kiểm soát biên độ.