震动反馈
源:Android Vibrator | iOS UIImpactFeedbackGenerator
震动反馈提升用户交互体验。本文展示如何跨平台触发震动。
平台差异对比
| 平台 | 原生 API | 震动模式 | 权限要求 |
|---|---|---|---|
| Android | Vibrator | 自定义时长、模式 | VIBRATE |
| iOS | UIFeedbackGenerator | 轻、中、重 | 无需权限 |
| Desktop | - | 无支持 | - |
标准代码块
kotlin
enum class VibrationIntensity {
LIGHT, MEDIUM, HEAVY
}
expect object Vibrator {
fun vibrate(duration: Long = 50)
fun vibrate(intensity: VibrationIntensity)
}kotlin
import android.content.Context
import android.os.VibrationEffect
import android.os.Vibrator
actual object Vibrator {
private lateinit var vibrator: Vibrator
fun init(context: Context) {
vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
}
actual fun vibrate(duration: Long) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
vibrator.vibrate(VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE))
} else {
@Suppress("DEPRECATION")
vibrator.vibrate(duration)
}
}
actual fun vibrate(intensity: VibrationIntensity) {
val duration = when (intensity) {
VibrationIntensity.LIGHT -> 20L
VibrationIntensity.MEDIUM -> 50L
VibrationIntensity.HEAVY -> 100L
}
vibrate(duration)
}
}kotlin
import platform.UIKit.*
actual object Vibrator {
actual fun vibrate(duration: Long) {
vibrate(VibrationIntensity.MEDIUM)
}
actual fun vibrate(intensity: VibrationIntensity) {
val generator = when (intensity) {
VibrationIntensity.LIGHT -> UIImpactFeedbackGenerator(UIImpactFeedbackStyleLight)
VibrationIntensity.MEDIUM -> UIImpactFeedbackGenerator(UIImpactFeedbackStyleMedium)
VibrationIntensity.HEAVY -> UIImpactFeedbackGenerator(UIImpactFeedbackStyleHeavy)
}
generator.prepare()
generator.impactOccurred()
}
}kotlin
actual object Vibrator {
actual fun vibrate(duration: Long) {}
actual fun vibrate(intensity: VibrationIntensity) {}
}AndroidManifest.xml
xml
<uses-permission android:name="android.permission.VIBRATE" />