Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在一个类似按钮的android开发者选项上检测一行中的多次点击_Android_Gesture - Fatal编程技术网

如何在一个类似按钮的android开发者选项上检测一行中的多次点击

如何在一个类似按钮的android开发者选项上检测一行中的多次点击,android,gesture,Android,Gesture,我想实现一个类似于android设置应用程序的开发者选项。我的意思是,当一个用户连续7次点击一个按钮时,每次点击之间都会出现一个小的延迟,这时会出现一个弹出窗口,要求他在应用程序中启用一个隐藏功能 如何实现这种行为?我基于看门狗概念开发了它。如果TimerWatchDog的实例未在指定时间内刷新,则该实例将执行该作业ContinuousClicksHandler使用TimerWatchDog的实例以及计算点击次数 用法: 连续单击Shandler.kt /** * @author aminog

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


如何实现这种行为?

我基于看门狗概念开发了它。如果
TimerWatchDog
的实例未在指定时间内刷新,则该实例将执行该作业
ContinuousClicksHandler
使用
TimerWatchDog
的实例以及计算点击次数

用法: 连续单击Shandler.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()
    }

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

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

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

}

如果要检查时间,请在每次单击时增加一个计数器:),同时保存一个时间变量并与之进行比较,然后在每次单击时更新时间变量。如果时间比预定义的时间间隔长,只需从1开始重新计数。我想可能有一个系统已经实现了的东西,比如双击或长点击:)可能有,但有时编写它似乎更快:)@kirotab是一个很好的解决方案,但是,当单击按钮时,必须添加计时器,因此,当单击距离上一个按钮太远时,它将重新启动为0,而不是继续计数。