如何在一个按钮上连续检测多次点击-像android开发人员选项

问题描述 投票:1回答:1

我想实现与开发人员选项的android设置应用类似的行为。我的意思是,当用户连续7次单击一个按钮时,每次单击之间都有很小的延迟,就会出现一个弹出窗口,要求他在应用程序中启用隐藏功能。

我该如何实现这种行为?

android gesture
1个回答
0
投票

我根据看门狗概念开发了它。如果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!")
}
© www.soinside.com 2019 - 2024. All rights reserved.