我想实现与开发人员选项的android设置应用类似的行为。我的意思是,当用户连续7次单击一个按钮时,每次单击之间都有很小的延迟,就会出现一个弹出窗口,要求他在应用程序中启用隐藏功能。
我该如何实现这种行为?
我根据看门狗概念开发了它。如果TimerWatchDog
的实例在指定时间内没有刷新,则该工作将执行。 ContinuousClicksHandler
使用TimerWatchDog
的实例并计算点击次数。
ContinuousClicksHandler.kt
/**
* @author aminography
*/
class ContinuousClicksHandler(
private val clicksCount: Int,
maxInterval: Long
) {
private var callback: ContinuousClicksCallback? = null
private val timerWatchDog = TimerWatchDog(maxInterval)
private var currentClicks = 0
fun click(): Int {
if (++currentClicks == clicksCount) {
timerWatchDog.cancel()
currentClicks = 0
callback?.onContinuousClicksSuccessful()
} else {
timerWatchDog.refresh {
currentClicks = 0
callback?.onContinuousClicksFailed()
}
}
return currentClicks
}
fun registerCallback(callback: ContinuousClicksCallback) {
this.callback = callback
}
interface ContinuousClicksCallback {
fun onContinuousClicksSuccessful()
fun onContinuousClicksFailed()
}
}
TimerWatchDog.kt
import java.util.*
/**
* @author aminography
*/
class TimerWatchDog(
private val delay: Long
) : Runnable {
private var timer: Timer? = null
private var job: (() -> Unit)? = null
fun refresh(job: () -> Unit) {
this.job = job
timer?.cancel()
val timerTask = object : TimerTask() {
override fun run() {
Thread(this@TimerWatchDog).start()
}
}
timer = Timer()
timer?.schedule(timerTask, delay)
}
fun cancel() {
timer?.cancel()
}
override fun run() {
job?.invoke()
}
}
val clicksCount = 7
val maxInterval = 1000L
val continuousClicksHandler = ContinuousClicksHandler(clicksCount, maxInterval)
continuousClicksHandler.registerCallback(object : ContinuousClicksHandler.ContinuousClicksCallback {
override fun onContinuousClicksSuccessful() {
println("onContinuousClicksSuccessful!")
}
override fun onContinuousClicksFailed() {
println("onContinuousClicksFailed!")
}
})
button.setOnClickListener {
val count = continuousClicksHandler.click()
showToast("Needs ${clicksCount - count} more clicks to succeed!")
}