如何检测按钮连续点击事件-类似于Android开发人员选项

3
我想实现与Android设置应用程序的开发人员选项类似的行为。我的意思是,当用户按下一个按钮7次并且每次点击之间有短暂延迟时,将弹出一个窗口询问他是否要在应用程序中启用一个隐藏功能。
我该如何实现这种行为?

2
每次点击都增加一个计数器 :) 如果您想检查时间,请保存一个时间变量并与其进行比较,并在每次单击时更新它。如果时间超过预定义的时间间隔,则从1开始重新计数。 - kirotab
我想也许系统已经实现了一些像双击或长按的功能 :) - galvan
可能有其他方法,但有时候直接手写会更快 :) - kirotab
@kirotab是一个不错的解决方案,但当按钮被点击时,您必须添加一个计时器,以便在两次点击之间时间太长时它会重新从0开始计数,而不是继续累加。 - Guillaume Imbert
2个回答

5
我基于看门狗的概念进行了开发。如果在指定时间内没有刷新,则TimerWatchDog的实例会执行该任务。ContinuousClicksHandler使用TimerWatchDog的一个实例以及计数点击次数。

用法:

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!")
}

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 timeout: Long) {

    private var timer: Timer? = null

    fun refresh(job: () -> Unit) {
        timer?.cancel()
        timer = Timer()
        timer?.schedule(object : TimerTask() {
            override fun run() = job.invoke()
        }, timeout)
    }

    fun cancel() = timer?.cancel()

}

0
您可以使用此OnClickListener来实现此操作。它适用于7次连续点击,每次点击之间的时间少于500毫秒。基本上,我们只需记住点击次数和最后一次点击的时间,并进行处理。这应该不难理解和/或修改。
...
view.setOnClickListener(continuousClickListener);
...


private final View.OnClickListener continuousClickListener = new View.OnClickListener() {

    private long lastTimeMs = 0;
    private int clickCount = 0;

    @Override
    public void onClick(View v) {
        long now = System.currentTimeMillis();
        if (lastTimeMs == 0 || now - lastTimeMs < 500) {
            lastTimeMs = now;
            clickCount++;
            if (clickCount >= 7) {
                // do stuff
                showToast("quiz enabled");
            } else {
                if (clickCount > 2) {
                    showToast((7-clickCount) + " more for quiz");
                }
            }
        } else {
            lastTimeMs = 0;
            clickCount = 0;
        }
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接