文章

设备震动

设备震动

iOS

在 iOS 设备上,可以通过 UIImpactFeedbackGeneratorAudioServicesPlaySystemSound 等方式来触发不同类型的震动反馈。

以下是常见的震动类型:

  1. 轻微震动(Light Impact)
  • API: UIImpactFeedbackGenerator(style: .light)
  • 这是较轻的触觉反馈,通常用于轻触或轻微操作的响应。
  1. 中等震动(Medium Impact)
  • API: UIImpactFeedbackGenerator(style: .medium)
  • 比轻微震动稍强,通常用于中等强度的操作反馈。
  1. 强烈震动(Heavy Impact)
  • API: UIImpactFeedbackGenerator(style: .heavy)
  • 用于强烈的触觉反馈,通常在需要引起用户注意的操作中使用。
  1. 软震动(Soft Impact)
  • API: UIImpactFeedbackGenerator(style: .soft)
  • 一种更细腻、柔和的震动反馈,只在 iOS 13 及以上版本可用。
  1. 刚性震动(Rigid Impact)
  • API: UIImpactFeedbackGenerator(style: .rigid)
  • 与软震动相反,是一种更刚性的触觉反馈,同样只在 iOS 13 及以上版本可用。
  1. 通知震动(Notification Feedback)
  • API: UINotificationFeedbackGenerator
  • 用于不同类型的通知反馈,有三种类型:
    • 成功通知: notificationOccurred(.success)
    • 警告通知: notificationOccurred(.warning)
    • 失败通知: notificationOccurred(.error)
  1. 选择震动(Selection Feedback)
  • API: UISelectionFeedbackGenerator
  • 用于选择或滚动选择器时的反馈。
  1. 默认震动(Default Vibration)
  • API: AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  • 这是系统的默认震动,通常用于来电或通知。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#import <UIKit/UIKit.h>

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建一个轻微震动的反馈生成器
    UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleLight];
    
    // 准备生成器(可选,但推荐在用户操作之前准备好)
    [generator prepare];
    
    // 触发轻微震动
    [generator impactOccurred];
}

@end

Android

需要在 Android 8.0 (API 级别 26) 及更高版本中使用 VibrationEffect.createOneShot 方法,并指定一个较低的振幅(amplitude)值。

在 Android 中,振幅值的范围是 1 到 255,1 表示最轻微的震动效果。

  1. 轻微震动(Light Impact)
    • 振幅值建议: 30-50
    • 这个范围内的振幅会提供一个较为轻微的震动反馈,类似于 iOS 的轻微触觉反馈。
  2. 中等震动(Medium Impact)
    • 振幅值建议: 100-150
    • 使用中等振幅值可以提供一个中等强度的震动效果,对应 iOS 的中等震动反馈。
  3. 强烈震动(Heavy Impact)
    • 振幅值建议: 200-255
    • 最高振幅值会产生最强烈的震动效果,类似于 iOS 的强烈震动反馈。
  4. 软震动(Soft Impact)
    • 振幅值建议: 10-20
    • 更细腻柔和的震动效果,适用于模仿 iOS 的软震动类型。
  5. 刚性震动(Rigid Impact)
    • 振幅值建议: 150-200
    • 刚性触感的震动效果,比中等振幅略强,但不如强烈震动剧烈。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static void vibrate(float duration) {
    try {
        if (sVibrateService != null && sVibrateService.hasVibrator()) {
            if (android.os.Build.VERSION.SDK_INT >= 26) {
                Class<?> vibrationEffectClass = Class.forName("android.os.VibrationEffect");
                if (vibrationEffectClass != null) {
                    // 设置轻微震动的振幅
                    final int LIGHT_AMPLITUDE = 50; // 设置较低的振幅值 (1-255)

                    // VibrationEffect.createOneShot(long milliseconds, int amplitude)
                    final Method method = vibrationEffectClass.getMethod("createOneShot",
                            new Class[]{Long.TYPE, Integer.TYPE});
                    Class<?> type = method.getReturnType();

                    // 调用 createOneShot 方法,传入持续时间和轻微振幅
                    Object effect = method.invoke(vibrationEffectClass,
                            new Object[]{(long) (duration * 1000), LIGHT_AMPLITUDE});
                    
                    // 使用反射调用 vibrate 方法
                    Cocos2dxReflectionHelper.invokeInstanceMethod(sVibrateService, "vibrate",
                            new Class[]{type}, new Object[]{(effect)});
                }
            } else {
                sVibrateService.vibrate((long) (duration * 1000));
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

本文由作者按照 CC BY 4.0 进行授权