Skip to content

震动反馈

源:Android Vibrator | iOS UIImpactFeedbackGenerator

震动反馈提升用户交互体验。本文展示如何跨平台触发震动。

平台差异对比

平台原生 API震动模式权限要求
AndroidVibrator自定义时长、模式VIBRATE
iOSUIFeedbackGenerator轻、中、重无需权限
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" />