android - 录制按钮随着时间的推移单击并进一步播放
问题描述
如何随时间记录两个按钮的状态(点击)。然后随着时间的推移重现他们的点击?我认为这可以通过创建.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
按以下方式使用实例:
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()
}
}
推荐阅读
- android - Android上的Tensorflow,输入输出名称
- c# - C# HTMLNode 正确获取 div 的 innerText
- laravel - 查询远方关系
- azure - 使用 Azure 服务总线对队列和主题/订阅进行消息排序传递
- java - 等待java异步调用完成
- checkbox - 在幻灯片菜单中使用复选框和滑块(在抽屉中),可以吗?
- google-chrome - 我们应该与 Chrome 进行“dns-prefetch 预连接”的域数量是否有限制?
- reactjs - 如何在 reactjs 中添加外部 JS 库
- ansible - 我无法修复 ansible 剧本
- spring-boot - webflux响应式编程中访问Post方法json RequestBody参数