有没有办法在它们之间发出 300 毫秒的指令?

Is there a way to make instructions with 300ms between them?

我有这个问题:我应该让 phone 振动 500 毫秒 *,暂停 300 毫秒,振动 500 毫秒 *,暂停 300 毫秒,最后振动 500 毫秒 *。我尝试使用处理程序,但不幸的是,它们好像在一次等待时间内加起来。有没有一种特定的方法可以按顺序执行所有这些操作并在它们之间设置延迟?一千个感谢。

时间因多种因素而异

    val vibration = requireActivity().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    Handler(Looper.getMainLooper()).postDelayed({
        vibration.vibrate(code.code.duration1.toLong())
    }, 600)
    Handler(Looper.getMainLooper()).postDelayed({
        vibration.vibrate(code.code.duration2.toLong())
    }, 2000)
    Handler(Looper.getMainLooper()).postDelayed({
        vibration.vibrate(code.code.duration3.toLong())
        id.setImageDrawable(AppCompatResources.getDrawable(requireActivity(), R.drawable.ic_play))
    }, 3600)

试试下面的代码,它非常适合我。

fun Fragment.vibratePhone() {
    val vibrator = context?.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            vibrator.vibrate(
                VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK),
                AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .setHapticChannelsMuted(false)
                    .setUsage(AudioAttributes.USAGE_ALARM)
                    .build()
            )
        } else {
            vibrator.vibrate(
                VibrationEffect.createOneShot(VIBRATION_TIME, VIBRATION_AMPLITUDE),
                AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .setUsage(AudioAttributes.USAGE_ALARM)
                    .build()
            )
        }
    } else {
        vibrator.vibrate(longArrayOf(0, 100, 50, 100, 50, 100), -1)
    }
}

在上面的代码中,你会看到,

  • 0表示延迟
  • 100 表示振动 100 毫秒
  • 50表示延迟
  • 100表示​​振动100ms等。
  • 重复:最后-1表示振动将按照您定义的模式发生并且不会重复否则定义几次您想要重复它。

您可以使用可读性更高的协程,而不是使用处理程序或线程。

myScope.launch(Dispatchers.Main) {
    vibration.vibrate(500)
    delay(500 + 300)
    vibration.vibrate(500)
    delay(500 + 300)
    vibration.vibrate(500)
}