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 xúc giác có sẵn trong Android. Ngoài ra, tài liệu này cũng trình bày thời điểm và cách thức kiểm tra xem có sự hỗ trợ cần thiết cho thiết bị hay không để đảm bảo hiệu ứng xúc giác hoạt động như bạn dự định.

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 các nguyên tắc thiết kế của Android xúc giác khi lựa chọn các nguyên tắc này. Bảng sau đây tóm tắt các thuộc tính cấp cao của mỗi phương pháp:

  • Khả năng cung cấp là đặc biệt quan trọng khi lên 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ợ từng thiết bị.
  • Công nghệ xúc giác rõ ràng mang đến những cảm giác sắc nét và rõ ràng, ít gây khó chịu cho người dùng.
  • Công nghệ xúc giác phong phú thể hiện cảm xúc mạnh mẽ 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 Phản hồi xúc giác phong phú
Hằng số phản hồi xúc giác Android 1.5 trở lên
(mỗi hằng số)
Hiệu ứng rung định sẵn Android 10 trở lên
Cấu trúc rungHiệu ứng Android 11 trở lên (mỗi hằng số)
Bật/tắt, rung 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 các thông báo đến.

Trang này cũng được mô tả là các khái niệm bổ sung trải rộng trên các nền tảng API:

  • Thiết bị có bộ rung không?
  • Điều khiển độ sáng cho phép hiệu ứng xúc giác mượt mà hơn, phong phú hơn, nhưng không được hỗ trợ trên mọi thiết bị.
  • VibrationAttributes() giúp bạn phân loại chế độ rung dựa trên mức sử dụng, đảm bảo chế độ cài đặt thích hợp cho người dùng sẽ được áp dụng và nhờ đó tránh gây bất ngờ cho người dùng.

HapticFeedbackConstants

Lớp HapticFeedbackConstants cung cấp các hằng số dựa trên hành động để cho phép các ứ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 riêng 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 đòi hỏi ứng dụng phải có quyền đặc biệt nào. Phương thức này phải tuân theo thuộc tính View.hapticFeedbackEnabled. Nếu bạn đặt thành false, tất cả lệnh gọi phản hồi xúc giác trên khung hiển thị sẽ bị tắt, kể cả các lệnh gọi mặc định. Tuỳ chọn chính liên quan đến thuộc tính View.hapticFeedbackEnabled (nếu được đặt là false) sẽ tắt mọi lệnh gọi phản hồi xúc giác trên khung hiển thị, kể cả các lệnh gọi mặc định. Phương thức này cũng hỗ trợ chế độ cài đặt hệ thống của người dùng để bật tính năng phản hồi bằng cách chạm.

Chỉ cần xem xét khả năng tương thích ở cấp SDK của hằng số cụ thể cho thao tác.

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

Mức 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ố định sẵn, chẳng hạn như CLICK, TICKDOUBLE_CLICK. Những 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 một VibrationEffect bất kỳ, 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ẽ chuyển về bản dự phòng chuẩn trên nền tảng.

Các API Vibrator.areEffectsSupportedVibrator.areAllEffectsSupported dùng để xác định xem có việc triển khai được tối ưu hoá cho thiết bị hay không. Bạn vẫn có thể dùng các hiệu ứng tạo sẵn mà không cần phương thức triển khai được tối ưu hoá. Các hiệu ứng này sẽ dùng tính năng dự phòng tiêu chuẩn của nền tảng. Do đó, các API areEffectsSupported này chỉ cần thiết 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ị:

Vì giá trị UNKNOWN cho biết API kiểm tra không có sẵn, nên thường được trả về cho tất cả hiệu ứng hoặc không có hiệu ứng nào. Những thiết bị này sẽ linh hoạt quay lại.

Sử dụng VibrationEffect được xác định trước

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

Bản sáng tác VibrationEffect

Thành phần VibrationEffect là một hiệu ứng rung được tạo bằng API VibrationEffect.startComposition. API này cho phép tạo hiệu ứng xúc giác phong phú bằng cách tạo một chuỗi dữ liệu gốc với độ trễ và cường độ có thể 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 được kết hợp nhằm tránh mang lại 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 một VibrationEffect bất kỳ, 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ợ mọi tính năng của API thành phần và điều quan trọng là bạn phải đảm bảo có sẵn các dữ liệu gốc.

Kiểm tra khả năng hỗ trợ rung ban đầu

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

Cách sử dụng cấu trúc VibrationEffect

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

Rung khi tắt, rung 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à kiểu bật tắt bộ 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ế xúc giác vì chúng có thể tạo ra ảnh động xúc giác; hãy tránh chúng trừ khi 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 khi bật khi tắt là thông báo. Trong đó, người dùng sẽ mong muốn một số chế độ rung, bất kể là gì. Rung của dạng sóng cũng cho phép một mẫu lặp lại vô thời hạn, như bạn có thể tưởng tượng cho nhạc chuông.

Mẫu chụp một lần tức là chế độ rung một lần trong vòng N mili giây.

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

  • Chỉ thời gian. Loại sóng này mô tả về thời lượng xen kẽ được dùng và thời lượng sử dụng. Thời gian này bắt đầu bằng thời lượng đã tắt. Do đó, mẫu dạng sóng thường bắt đầu bằng giá trị bằng 0 để cho biết là bắt đầu rung ngay lập tức.
  • Thời gian và biên độ. Loại sóng này có thêm một mảng biên độ để phù hợp với từng số liệu thời gian, thay vì bật tắt ngầm của dạng đầu tiên. Tuy nhiên, điều quan trọng là phải kiểm tra để đảm bảo thiết bị có hỗ trợ kiểm soát biên độ để đảm bảo có thể đạt được tỷ lệ dự kiến.

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

Vì chế độ rung khi tắt là hình thức rung lâu đời nhất, nên các chế độ rung 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 của trang này.

Để phát bất kỳ lệnh gọi VibrationEffect nào hoặc vibrate kiểu cũ, bạn cần có 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 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ó kiểm soát biên độ. Vì vậy, bạn cần kiểm tra xem có hỗ trợ hay không bằng cách sử dụng Vibrator.hasAmplitudeControl. 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 cẩn thận xem hiệu ứng có đủ chất lượng khi không kiểm soát biên độ hay không. Việc quay lại sử dụng chế độ rung bật tắt được thiết kế rõ ràng có thể tốt hơn.

Sử dụng chế độ rung khi bật khi 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 hiện 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 của ứ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 biểu mẫu này đều có mẫu dạng sóng bật tắt cơ bản, như mô tả trước đó, trong đó mục nhập đầu tiên là độ trễ trước khi bật bộ rung.

Khái niệm chung

Có 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 một lớp Vibrator khác 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ó tác dụng nào, vì vậy, ứng dụng không cần phải bảo vệ tất cả 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 là bộ rung thực (true) hay mã giả lập (false).

Người dùng có tắt công nghệ cảm ứng xúc giác không?

Một số phương thức triển khai tuỳ chỉnh có thể yêu cầu kiểm tra theo cách thủ công xem người dùng đã tắt hoàn toàn chế độ cài đặt Phản hồi khi chạm của Android hay chưa. Trong trường hợp đó, các hiệu ứng phản hồi bằng cách chạm sẽ bị chặn. 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à đang tắt.

Thuộc tính rung

Bạn có thể cung cấp các thuộc tính rung (hiện có dạng AudioAttributes) để thông báo cho hệ thống về mục đích rung. Đây là yêu cầu bắt buộc khi kích hoạt chế độ rung khi ứng dụng của bạn chạy trong nền, vì chỉ hỗ trợ xúc giác chú ý mới được hỗ trợ khi 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.

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

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

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

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