Thêm phản hồi xúc giác vào sự kiện

Một trong những trường hợp sử dụng cơ bản nhất của tính năng haptics là cung cấp phản hồi cho các lượt tương tác của người dùng. Bộ chọn thời gian, thao tác nhấn phím trên bàn phím ảo và lựa chọn văn bản là những ví dụ phổ biến về các trường hợp sử dụng hiệu quả tính năng phản hồi xúc giác. Để biết thêm thông tin về thời điểm và cách áp dụng tính năng phản hồi xúc giác, hãy đọc bài viết Nguyên tắc thiết kế phản hồi xúc giác.

Trang này mô tả 3 cách để cung cấp phản hồi xúc giác.

Các phương thức này sử dụng các đối tượng gốc được xác định ở cấp thiết bị để cung cấp phản hồi chất lượng cao phù hợp với thiết bị đang sử dụng.

Theo mặc định, tất cả các phương thức phản hồi xúc giác đều tuân theo chế độ cài đặt phản hồi cảm ứng của người dùng.

Sử dụng các thành phần View để tạo phản hồi xúc giác

Sử dụng phương thức View.performHapticFeedback để tạo phản hồi xúc giác. Các hằng phản hồi xúc giác do HapticFeedbackConstants xác định tập trung vào chức năng của chúng trong một ứng dụng, chứ không phải loại hiệu ứng xúc giác được thực hiện.

Cách triển khai cơ bản có thể khác nhau tuỳ thuộc vào thiết bị và chức năng phần cứng, nhưng ứng dụng chỉ cần xem xét loại phản hồi cần cung cấp trong một ngữ cảnh cụ thể. Bằng cách tập trung vào chức năng này, bạn có thể bật tính năng phản hồi xúc giác cho các hoạt động tương tác tương tự. Theo thời gian, người dùng sẽ học cách liên kết các ý nghĩa khác nhau với các cảm giác xúc giác khác nhau.

Điều kiện tiên quyết: Bật tính năng phản hồi xúc giác

Miễn là View hiển thị, bạn có thể sử dụng phản hồi xúc giác cho các sự kiện của nó. Một số sự kiện, chẳng hạn như nhấn và giữ, có tính năng haptics mặc định được kích hoạt nếu trình nghe trên thành phần hiển thị xử lý sự kiện (trả về true).

View Android có thể tắt phản hồi xúc giác bằng cách đặt thuộc tính View.hapticFeedbackEnabled thành false. Việc tắt thuộc tính này sẽ dẫn đến phản hồi mặc định.

Phương thức performHapticFeedback cũng tuân theo chế độ cài đặt hệ thống HAPTIC_FEEDBACK_ENABLED, cho phép người dùng có thể tắt các chế độ cài đặt đó cho toàn bộ hệ thống.

Không giống như các API haptics khác, việc sử dụng HapticFeedbackConstants với View không yêu cầu quyền VIBRATE.

Chọn một HapticFeedbackConstant

Khi sử dụng các thành phần View với HapticFeedbackConstants, bạn không cần đánh giá khả năng hỗ trợ thiết bị cụ thể, vì các hằng số này sẽ có hành vi dự phòng nếu cần. Điều duy nhất cần cân nhắc là cấp độ SDK của hằng số mong muốn.

Ví dụ 1: Nhấn phím

Đây là ví dụ về cách thêm phản hồi xúc giác vào phương thức nhập bằng cách chạm trong View bằng trình nghe thao tác chạm. Các hiệu ứng này mô phỏng cảm giác nhấn xuống một nút rồi thả ra.

Kotlin

class HapticTouchListener : View.OnTouchListener {
  override fun onTouch(View view, MotionEvent event) : Boolean {
    when (event.actionMasked) {
      MotionEvent.ACTION_DOWN ->
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
      MotionEvent.ACTION_UP ->
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE)
    }
    return true
  }
}

Java

class HapticTouchListener implements View.OnTouchListener {
  @Override
  public boolean onTouch(View view, MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
        break;
      case MotionEvent.ACTION_UP:
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE);
        break;
    }
    return true;
  }
}

Ví dụ 2: Nút Gửi

Trường hợp sử dụng phản hồi xúc giác không chỉ dừng lại ở việc mô phỏng hoạt động tương tác thực tế với thiết bị. Chúng cũng có thể được dùng để truyền tải một ý nghĩa trừu tượng. Ví dụ: mong đợi chung đối với hiệu ứng CONFIRM là một độ rung ngắn và nhẹ, trong khi REJECT có thể là phản hồi mạnh mẽ hơn để báo hiệu lỗi. Điều này được minh hoạ trong ví dụ sau về ý kiến phản hồi về nút gửi.

Kotlin

submitButton.setOnClickListener { view ->
  val successful = performSubmit()
  if (successful) {
    view.performHapticFeedback(HapticFeedbackConstants.CONFIRM)
  } else {
    view.performHapticFeedback(HapticFeedbackConstants.REJECT)
  }
}

Java

submitButton.setOnClickListener(view -> {
  boolean successful = performSubmit();
  if (successful) {
    view.performHapticFeedback(HapticFeedbackConstants.CONFIRM);
  } else {
    view.performHapticFeedback(HapticFeedbackConstants.REJECT);
  }
});

Sử dụng VibrationEffect được xác định trước để tạo phản hồi xúc giác

Việc sử dụng phương pháp dựa trên View tập trung vào hoạt động tương tác của người dùng. Bạn nên sử dụng phương thức này để đảm bảo tính nhất quán trên toàn hệ thống. Tuy nhiên, bạn cũng có thể gọi các API VibrationEffect cụ thể được xác định trước cho các hiệu ứng phản hồi xúc giác tuỳ chỉnh.

Các hiệu ứng được xác định trước có sẵn dưới dạng hằng số VibrationEffect và có thể được kiểm tra để hỗ trợ cũng như phát bằng dịch vụ Vibrator như trong các ví dụ sau.

Tìm hiểu khả năng hỗ trợ thiết bị của API VibrationEffect

Trong cách sử dụng cơ bản, bạn không cần kiểm tra xem các API VibrationEffect riêng lẻ có được hỗ trợ hay không. Các API như Vibrator.areEffectsSupportedVibrator.areAllEffectsSupported được dùng để xác định xem thiết bị có triển khai hằng số theo cách tuỳ chỉnh hay không. Nếu không có hiệu ứng tuỳ chỉnh, ứng dụng của bạn vẫn có thể phát các hiệu ứng và sử dụng phương thức triển khai dự phòng do nền tảng xác định.

Để biết thêm thông tin, hãy xem phần VibrationEffect được xác định trước.

Điều kiện tiên quyết: Tải Bộ rung và quyền VIBRATE

Hầu hết các chế độ rung đều có thể phát bằng dịch vụ Vibrator. Bạn có thể tải dịch vụ này như sau:

Kotlin

import android.os.Vibrator

val vibrator = context.getSystemService(Vibrator::class.java)

Java

import android.os.Vibrator;

Vibrator vibrator = context.getSystemService(Vibrator.class);

Ứng dụng cần có quyền VIBRATE để rung thiết bị bằng dịch vụ này. Bạn có thể thêm quyền này vào tệp kê khai ứng dụng:

<uses-permission android:name="android.permission.VIBRATE"/>

Phát một VibrationEffect được xác định trước

Bạn có thể chuẩn bị các hiệu ứng được xác định trước bằng VibrationEffect.createPredefined, sau đó phát bằng một trong các phương thức vibrate trên Vibrator.

Ví dụ này phát hiệu ứng Nhấp.

Kotlin

val vibrator = context.getSystemService(Vibrator::class.java)
...
// Requires VIBRATE permission
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))

Java

Vibrator vibrator = context.getSystemService(Vibrator.class);
...
// Requires VIBRATE permission
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));

Sử dụng các thành phần nâng cao với các thành phần gốc

API VibrationEffect.Composition cung cấp thêm các khả năng cho phản hồi xúc giác. Tuy nhiên, không giống như các hiệu ứng, các đối tượng gốc này không có phương án dự phòng ở cấp hệ thống, nghĩa là bạn cần phải chú ý đến các đối tượng gốc và các chức năng khác mà thiết bị hỗ trợ.

Việc sử dụng các API này được thảo luận chi tiết hơn trong phần Tạo hiệu ứng xúc giác tuỳ chỉnh.