复制代码
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)
}
}
}