设备震动
设备震动
iOS
在 iOS 设备上,可以通过 UIImpactFeedbackGenerator
和 AudioServicesPlaySystemSound
等方式来触发不同类型的震动反馈。
以下是常见的震动类型:
- 轻微震动(Light Impact)
- API:
UIImpactFeedbackGenerator(style: .light)
- 这是较轻的触觉反馈,通常用于轻触或轻微操作的响应。
- 中等震动(Medium Impact)
- API:
UIImpactFeedbackGenerator(style: .medium)
- 比轻微震动稍强,通常用于中等强度的操作反馈。
- 强烈震动(Heavy Impact)
- API:
UIImpactFeedbackGenerator(style: .heavy)
- 用于强烈的触觉反馈,通常在需要引起用户注意的操作中使用。
- 软震动(Soft Impact)
- API:
UIImpactFeedbackGenerator(style: .soft)
- 一种更细腻、柔和的震动反馈,只在 iOS 13 及以上版本可用。
- 刚性震动(Rigid Impact)
- API:
UIImpactFeedbackGenerator(style: .rigid)
- 与软震动相反,是一种更刚性的触觉反馈,同样只在 iOS 13 及以上版本可用。
- 通知震动(Notification Feedback)
- API:
UINotificationFeedbackGenerator
- 用于不同类型的通知反馈,有三种类型:
- 成功通知:
notificationOccurred(.success)
- 警告通知:
notificationOccurred(.warning)
- 失败通知:
notificationOccurred(.error)
- 成功通知:
- 选择震动(Selection Feedback)
- API:
UISelectionFeedbackGenerator
- 用于选择或滚动选择器时的反馈。
- 默认震动(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 表示最轻微的震动效果。
- 轻微震动(Light Impact)
- 振幅值建议:
30-50
- 这个范围内的振幅会提供一个较为轻微的震动反馈,类似于 iOS 的轻微触觉反馈。
- 振幅值建议:
- 中等震动(Medium Impact)
- 振幅值建议:
100-150
- 使用中等振幅值可以提供一个中等强度的震动效果,对应 iOS 的中等震动反馈。
- 振幅值建议:
- 强烈震动(Heavy Impact)
- 振幅值建议:
200-255
- 最高振幅值会产生最强烈的震动效果,类似于 iOS 的强烈震动反馈。
- 振幅值建议:
- 软震动(Soft Impact)
- 振幅值建议:
10-20
- 更细腻柔和的震动效果,适用于模仿 iOS 的软震动类型。
- 振幅值建议:
- 刚性震动(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 进行授权