用于监听特定 View 的连续点击事件,触发隐藏功能

定义方法:

复制代码
import android.view.View

/**
 * <pre>
 *     作者:Caowj
 *     日期:2026/1/16_11:06
 * </pre>
 */

/**
 * 隐藏功能点击处理器
 * 用于监听特定 View 的连续点击事件,触发隐藏功能
 *
 * @param targetView 需要监听的 View
 * @param clickCountThreshold 触发隐藏功能所需的点击次数,默认 7 次
 * @param resetIntervalMs 重置计数器的时间间隔(毫秒),默认 1000ms
 * @param onTrigger 触发隐藏功能时的回调
 */
class HiddenFeatureClickHandler(
    private val targetView: View,
    private val clickCountThreshold: Int = 6,
    private val resetIntervalMs: Long = 1000L,
    private val onTrigger: () -> Unit
) {
    private var clickCount = 0
    private var lastClickTime = 0L

    init {
        require(clickCountThreshold > 0) { "clickCountThreshold must be greater than 0" }
        require(resetIntervalMs > 0) { "resetIntervalMs must be greater than 0" }
        setupClickListener()
    }

    private fun setupClickListener() {
        targetView.setOnClickListener {
            handleClick()
        }
    }

    /**
     * 处理点击事件
     */
    private fun handleClick() {
        val now = System.currentTimeMillis()

        // 如果超过重置时间间隔,重置计数器
        if (now - lastClickTime > resetIntervalMs) {
            resetCounter()
        }

        clickCount++
        lastClickTime = now

        // 达到触发条件
        if (clickCount >= clickCountThreshold) {
            onTrigger.invoke()
            resetCounter()

            // 可选:提供触觉反馈
            provideHapticFeedback()
        }
    }

    /**
     * 重置计数器
     */
    private fun resetCounter() {
        clickCount = 0
    }

    /**
     * 提供触觉反馈(可选)
     */
    private fun provideHapticFeedback() {
        targetView.performHapticFeedback(
            android.view.HapticFeedbackConstants.LONG_PRESS
        )
    }

    /**
     * 手动重置点击计数器
     */
    fun reset() {
        resetCounter()
    }

    /**
     * 获取当前点击次数
     */
    fun getCurrentClickCount(): Int = clickCount

    /**
     * 获取剩余点击次数
     */
    fun getRemainingClicks(): Int =
        maxOf(0, clickCountThreshold - clickCount)

    /**
     * 销毁时释放资源
     */
    fun destroy() {
        targetView.setOnClickListener(null)
        resetCounter()
    }

    companion object {
        /**
         * 快速创建并绑定到 View
         *
         * @param view 目标 View
         * @param clicks 触发所需的点击次数,默认 6
         * @param interval 重置时间间隔(秒),默认 1 秒
         * @param onTrigger 触发回调
         */
        @JvmStatic
        fun bind(
            view: View,
            clicks: Int = 6,
            interval: Long = 1000L,
            onTrigger: () -> Unit
        ): HiddenFeatureClickHandler {
            return HiddenFeatureClickHandler(view, clicks, interval, onTrigger)
        }

        /**
         * 快速创建并绑定到 View
         *
         * @param view 目标 View
         * @param onTrigger 触发回调
         */
        @JvmStatic
        fun bind(
            view: View,
            onTrigger: () -> Unit
        ): HiddenFeatureClickHandler {
            return HiddenFeatureClickHandler(view, 6, 1000L, onTrigger)
        }
    }
}

使用:

复制代码
HiddenFeatureClickHandler.bind(tvVersion, {
                    // 点击了。。。
                })