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()
}
}