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 phản hồi xúc giác là đưa ra ý kiến phản hồi về hoạt động tương tác của người dùng. Bộ chọn giờ, thao tác nhấn phím trên bàn phím ảo và lựa chọn văn bản là các ví dụ phổ biến về những trường hợp sử dụng phù hợp đối với 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 xúc giác, hãy đọc Nguyên tắc thiết kế của 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 dữ liệu 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ả phương thức phản hồi xúc giác đều tuân theo chế độ cài đặt phản hồi chạm 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 số xúc giác do HapticFeedbackConstants xác định tập trung vào chức năng của chúng trong ứ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ỳ theo khả năng của thiết bị và phần cứng, nhưng ứng dụng chỉ cần xem xét loại phản hồi để cung cấp trong một ngữ cảnh cụ thể. Bằng cách tập trung vào chức năng, 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ự. Người dùng 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 theo thời gian.

Đ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 còn hiển thị, phản hồi xúc giác có thể được dùng cho các sự kiện. Một số sự kiện, chẳng hạn như nhấn và giữ, sẽ kích hoạt phản hồi xúc giác mặc định nếu một trình nghe trên khung hiển thị xử lý sự kiện (trả về true).

View trên Android có thể tắt tính năng 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 đó trên toàn bộ hệ thống.

Không giống như các API xúc giác 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. Yếu tố duy nhất cần xem xét 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 dùng trình nghe thao tác chạm để 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. Các hiệu ứng này mô phỏng cảm giác nhấn nút xuống 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

Các 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 tương tác vật lý với thiết bị. Cũng có thể dùng các thành phần này để truyền tải ý nghĩa trừu tượng. Ví dụ: kỳ vọng chung đối với hiệu ứng CONFIRM là độ rung ngắn và nhẹ trong khi REJECT có thể là phản hồi mạnh 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);
  }
});

Dùng một VibrationEffect được xác định trước để tạo phản hồi xúc giác

Phương pháp sử dụng dựa trên View sẽ tập trung vào hoạt động tương tác của người dùng. Ưu tiên 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ể đã xác định trước để có các hiệu ứng phản hồi xúc giác tuỳ chỉnh.

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

Tìm hiểu về tính năng hỗ trợ thiết bị của các API VibrationEffect

Trong cách sử dụng cơ bản, bạn không cần kiểm tra khả năng hỗ trợ của từng API VibrationEffect. Các API như Vibrator.areEffectsSupportedVibrator.areAllEffectsSupported được dùng để xác định xem thiết bị có cách triển khai hằng số 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 mục Được xác định trước VibrationEffect.

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

Bạn có thể phát hầu hết các chế độ rung bằng dịch vụ Vibrator 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 định sẵn bằng cách sử dụ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 chuột.

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 có dữ liệu gốc

API VibrationEffect.Composition cung cấp thêm các khả năng phản hồi xúc giác. Tuy nhiên, không giống như hiệu ứng, các dữ liệu gốc này không có bản dự phòng ở cấp hệ thống. Điều này có nghĩa là bạn cần chú ý kỹ đến các dữ liệu 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 sẽ được thảo luận chi tiết hơn trong bài viết Tạo hiệu ứng xúc giác tuỳ chỉnh.