12/08/2018, 16:26

Hiệu ứng Rung và điều chỉnh Rung trong Android

Thêm hiệu ứng Rung vào ứng dụng Để thêm hiệu ứng rung vào ứng dụng của bạn thì thông thường rất đơn giản. Tất cả chỉ cần thêm nó vào file Manifest trong ứng dụng của bạn. <uses-permission android:name="android.permission.VIBRATE"/> Vibrator vibrator = (Vibrator) ...

Thêm hiệu ứng Rung vào ứng dụng

Để thêm hiệu ứng rung vào ứng dụng của bạn thì thông thường rất đơn giản. Tất cả chỉ cần thêm nó vào file Manifest trong ứng dụng của bạn.

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

Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if (vibrator.hasVibrator()) {
  vibrator.vibrate(500); // for 500 ms
}

Mặc dù vibrate() nó chỉ sử dụng được đến SDK 25 nhưng bạn có thể nghiên cứu và sử dụng lớp VibrationEffect mới được giới thiệu để thay thế nó.

** Xây dựng một mô hình hiệu ứng rung theo cá nhân**

Hiệu ứng rung trong Android hoạt động dựa trên lệnh play & pause . Vì vậy ở đây tôi ví dụ như :

  • Bạn muốn thiết bị rung trong 3s và dừng lại trong 1s
  • Và sau đó thiết bị lại rung lại trong 4s thì mô hình của tôi sẽ là {300, 100, 400}
  • Khi chức năng rung thiết bị bắt đầu thì nó luôn xử lý phần tử đầu tiên của mảng như là thời gian chờ trong số ms bạn cài đặt . Nó sẽ bắt đầu rung một thiết bị sau array[0]ms.
  • Nếu bạn không muốn có thời gian chờ ban đầu của sự kiện thì bạn sẽ sửa lại mảng điều chỉnh như thế này: {0, 300, 100, 400};
private void customVibratePatternNoRepeat() {
    // 0: Bắt đầu mà không có sự chậm trễ
    // 300: Rung trong 3s
    // 100: Tạm dừng trong 1s
    // 400: Rung trong 4s
    long[] mVibratePattern = new long[]{0, 300, 100, 400};

    // -1: Nếu bạn không muốn nó lặp lại
    / / 0 nếu bạn muốn nó lặp lại từ vị trí phần tử đầu tiên
     vibrator.vibrate(mVibratePattern, -1);
}

Bằng cách cho -1 đến vibrate() nghĩa là tôi cài đặt nó chỉ rung theo quy trình trên 1 lần duy nhất. Nếu bạn muốn nó lặp lại thì bạn có thể thay thế -1 bằng vị trí của phần tử (0,1,2,....). Để huỷ sự kiện rung thiết bị thì bạn chỉ cần gọi đến hàm vibrator.cancel() . Vậy là nó đã kết thúc sự kiện.

Lặp lại mô hình rung từ vị trí phần tử cụ thể

Tôi có một ví dụ:

long[] mVibratePattern = new long[]{0,400,800,600,800,800,800,1000};
  • 0 : Trễ ban đầu 0ms
  • 400 : Rung cho 400ms
  • 800 : Tạm dừng cho 800ms
  • 600 : Rung cho 600ms
  • 800 : Tạm dừng cho 800ms
  • 800 : Rung cho 800ms
  • 800 : Tạm dừng cho 800ms
  • 1000 : Rung cho 1000ms

Ở đây tôi đang tăng thời gian rung trong thiết bị bằng 2s. Giả sử tôi muốn lặp lại rung từ phần rung 600ms (vị trí thử 3trong mảng) trở đi và tôi sẽ vượt qua khởi đầu của trí của 600ms để chạy vibrate() thì tôi sẽ thiết lập lại hàm vibrate() như thế này:

// 3 : Lặp lại mô hình rung từ phần tử thứ 3 của mảng
vibrator.vibrate(mVibratePattern, 3);

VibrationEffect thay thế cho vibrate() từ SDK 26 trở đi

Trong lớp VibrationEffect thì nó có 3 phương pháp để tạo chức năng rung trên thiết bị:

  • createOneShot ();
  • createWaveForm ();
  • createWaveForm (); Các bạn có nghiên cứu các phương pháp đó tại đây : https://developer.android.com/reference/android/os/VibrationEffect.html

Để sử dụng được các phương pháp này thì các bạn phải nắm rõ về Biên độ chính xác trong android. Biên độ Biên độ được sử dụng để mô tả giá trị đỉnh của âm rung trong đó giá trị âm thể hiện sự không rung động nên chúng ta không cần đến phần này. Vì thế :

  • Nếu bạn muốn kiểm soát cường độ rung, bạn cần phải sử dụng thông số AMPLITUDE (biên độ).
  • Trong rung android biên độ 0 cho biết động cơ rung là tắt và khi biên độ bằng 255 thì độ rung đạt mức tối đa của thiết bị.

createOneShot()

Phương pháp này chỉ đơn giản là sẽ tạo ra một rung động mà liên tục sẽ rung thiết bị trong thời gian quy định tại vibrateTimeInMills.

@RequiresApi(api = Build.VERSION_CODES.O) 
private void createOneShotVibrationUsingVibrationEffect() {
   // 1000 : Rung trong 1s
   // VibrationEffect.DEFAULT_AMPLITUDE - sẽ thực hiện rung động ở cường độ cao
   VibrationEffect effect = VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE);
   vibrator.vibrate(effect);
 }

Để tăng hoặc giảm độ rung, chúng ta cần phải thiết đặt xung quanh giá trị AMPLITUDE bằng cách truyền 50,100,150 ... và 255 là cao nhất và 0 có nghĩa là không rung nữa.

createWaveForm(long[] timings, int repeat)

Phương pháp này hoạt động giống như hàm vibrate(mVibratePattern,mRepeatIndex);

@RequiresApi(api = Build.VERSION_CODES.O)
private void createOneShotVibrationUsingVibrationEffect() {
   // 1000 : rung trong 1 giây
   // 0 : lặp lại rung từ vị trí 0
   VibrationEffect effect = VibrationEffect.createWaveForm(1000, 0);
   vibrator.vibrate(effect);
}

createWaveForm(long[] vibratePattern, int[] amplitudes, int repeat)

Phương pháp này sử dụng mảng AMPLITUDES để quyết định cường độ của mô hình rung động. 0 là giá trị thấp nhất và 255 là giá trị cao nhất.

@RequiresApi(api = Build.VERSION_CODES.O)
private void createWaveFormVibrationUsingVibrationEffectAndAmplitude() {
    long[] mVibratePattern = new long[]{0, 400, 800, 600, 800, 800, 800, 1000};
    int[] mAmplitudes = new int[]{0, 255, 0, 255, 0, 255, 0, 255};
    // -1 : Hoạt động 1 lần không lặp lại

    if (vibrator.hasAmplitudeControl()) {
         VibrationEffect effect = VibrationEffect.createWaveform(mVibratePattern, mAmplitudes, -1);
         vibrator.vibrate(effect);
     }
}

Mô hình đã đề cập ở trên sẽ làm rung điện thoại ở mức đầy đủ chính xác 4 lần kể từ khi trong mảng AMPLITUDES nó có 4 x 255 và phần còn lại là 0 có nghĩa là nó sẽ không phát rung trên những lần nó xuất hiện.

Xử lý sự cố

  • Kiểm tra xem ứng dụng của bạn có sự cho phép để VIBRATE trong file Manifest.
  • Kiểm tra xem thiết bị của bạn có rung bởi vibrator.hasVibrator();
  • Nếu bạn đang thực hiện kiểm soát biên độ: hãy kiểm tra vibrator.hasAmplitudeControl()
  • Kích thước mảng mVibratePatternvà mAmplitudes phải có cùng chiều dài .

Kết Luận

Hiệu ứng rung thiết bị trong ứng dụng cũng góp phần lớn sự thu hút và chú ý của người dùng đến ứng dụng của bạn. Vì vậy bạn hãy sử dụng chúng một cách chính xác, đúng đắn và khôn ngoan. Xin cảm ơn

0