Android 随着时间的推移单击录制按钮并进一步播放

Android 随着时间的推移单击录制按钮并进一步播放,android,Android,如何随时间记录两个按钮的状态(单击)。然后随着时间的推移重现他们的点击?我认为这可以通过创建.midi文件并进一步打开和播放来实现,或者可以通过performClick()来实现 钢琴类型应用程序使用此功能,您可以录制您以.midi或.mid格式弹奏钢琴,然后再弹奏 您可以制作一个ClickRecorder,记录一段时间内的按钮id和延迟 data class Click(val id: Int, val timeMs: Long) class ClickRecorder { var

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

钢琴类型应用程序使用此功能,您可以录制您以
.midi
.mid
格式弹奏钢琴,然后再弹奏

您可以制作一个
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.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)
    }
}

我不明白你的问题。是否要录制或重播按钮单击或同时录制和重播?两者-录制和重播。就像Google Play中的“piano apps”一样,只需在按钮的
onClick
中调用录制方法即可录制。对于回放,我建议您使用单独的方法播放声音,而不是执行单击。但您可以使用
postDelayed
performClick
为愚蠢的问题道歉:-)在
onClick
中的录制方法看起来如何?我在谷歌上搜索,但找不到。例如,你可以有一个列表,并在按钮被点击时添加时间。这可能有助于将随着时间推移的按钮点击组合转换为midi格式?因此,以后您可以在另一台设备上使用此组合,只需播放一个midi文件?我知道我仍然需要安装midi库()是的,很可能您需要将每个按钮ID映射到midi事件
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)
    }
}
fun playRecordedClicks(clickPlayer: ClickPlayer, clicks: List<Click>) {
    clickPlayer.play(clicks) {
        findViewById<Button>(it.id).performClick()
    }
}