首页 > 解决方案 > 录制按钮随着时间的推移单击并进一步播放

问题描述

如何随时间记录两个按钮的状态(点击)。然后随着时间的推移重现他们的点击?我认为这可以通过创建.midi文件然后进一步打开和播放来实现,还是可以通过performClick ()

钢琴类应用程序使用此功能,您可以在其中记录您弹奏钢琴的格式.midi.mid格式,然后播放 “钢琴应用程序”示例

标签: android

解决方案


您可以制作一个ClickRecorder记录按钮 ID 和延迟一段时间的按钮。

data class Click(val id: Int, val timeMs: Long)

class ClickRecorder {
    var isRecording = false
    private var currentTIme: Long = 0
    private val clicks = mutableListOf<Click>()

    fun getClicks(): List<Click>? = if (!isRecording) clicks else null

    fun recordClick(id: Int) = if (isRecording) {
        val diff = System.currentTimeMillis().minus(currentTIme)
        clicks.add(Click(id, diff))
        currentTIme = System.currentTimeMillis()
    } else null

    fun start() {
        clicks.clear()
        currentTIme = System.currentTimeMillis()
        isRecording = true
    }

    fun stop() {
        isRecording = false
    }
}

ClickRecorder按以下方式使用实例:

val clickRecorder = ClickRecorder()

fun onRecordButtonClick(v: View) {
    val btRecord = v as Button
    when (btRecord.text) {
        RECORD -> {
            clickRecorder.start()
            btRecord.text = STOP
        }
        STOP -> {
            clickRecorder.stop()
            btRecord.text = RECORD
        }
    }
}

fun onPianoButtonsClick(v: View) {
    clickRecorder.recordClick(v.id)
}

完成录制后,您可以通过 访问录制的点击次数ClickRecorder.getClicks()。要模拟您需要进行的点击ClickPlayer

class ClickPlayer() {
    private val index = AtomicInteger(0)
    private val handler = Handler()

    fun play(list: List<Click>, callback: (Click) -> Unit) {
        index.set(0)
        val runnable = object : Runnable {
            override fun run() {
                if (index.get() < list.size) {
                    val click = list[index.getAndIncrement()]
                    callback(click)
                    val nextIndex = index.get()
                    if (nextIndex < list.size) handler.postDelayed(this, list[nextIndex].timeMs)
                }
            }
        }
        handler.postDelayed(runnable, list[index.get()].timeMs)
    }
}

ClickPlayer按以下方式使用

fun playRecordedClicks(clickPlayer: ClickPlayer, clicks: List<Click>) {
    clickPlayer.play(clicks) {
        findViewById<Button>(it.id).performClick()
    }
}

推荐阅读