<
Android 双击 任意次连击事件
>
上一篇

Compose 的渲染过程三阶段,view 的绘制过程三阶段
下一篇

Harmonyos学习笔记 路由 导航 页面跳转

Android 双击 任意次连击事件

双击

    // 成员变量
    private var lastClickTime: Long = 0
    private val doubleClickInterval = 300L // 双击间隔时间

    // 在 onClick 或 ACTION_UP 或 addCallback 或 onBackPress 或 其它能响应事件的地方
    val currentTime = System.currentTimeMillis()
    if (currentTime - lastClickTime <= doubleClickInterval) {
        // 双击
        // do something
    } else {
        // 单击
        // do something
    }
    lastClickTime = currentTime

连点

    private val size = 5 // 定义需要点击的次数
    private val interval = 200
    private var mHints: Array<Long?> = arrayOfNulls(size) // 记录最近几次点击的时间戳

    // 1. 点击时间记录:
    // 用 mHints 数组来存储最近几次点击的时间戳
    // 通过 System.arraycopy 将数组元素向前移动一位,确保最新的点击时间放在最后一位
    // 2. 时间间隔判断:
    // 计算连续点击是否在有效时间间隔内,如果满足条件则调用 listener()
    // 否则,会遍历数组,从最可能不符合的点击开始读取,并调用 continueListener,参数代表达到连点成功还需要点击的次数
    private fun onMultiClick(
        continueListener: ((Int) -> Unit)? = null,
        listener: () -> Unit
    ) {
        val currentTime = SystemClock.uptimeMillis()
        // 将数组元素向前移动一位,并把最新的点击时间放在最后一位
        System.arraycopy(mHints, 1, mHints, 0, mHints.size - 1)
        mHints[mHints.size - 1] = currentTime
        val time = interval * size
        // 检查是否满足连续点击条件
        if (currentTime - (mHints[0] ?: 0L) <= time) { // 连续点击之间有效间隔
            mHints = arrayOfNulls(size) // 重置(也许不是必要的)
            listener() // 调用有效的点击事件
        } else {
            // 检查每次点击的时间
            for (i in 0 until size) {
                if (currentTime - (mHints[i] ?: 0L) <= time) {
                    // 回调 达到连点成功还需要点击的次数
                    continueListener?.invoke(i)
                    break
                }
            }
        }
    }

    // 使用
    onMultiClick({ i ->
        // tips
		// toast("快速再按 $i 次 查看更多")
    }) {
        // do something
		// dialog.show()
    }
Top
Foot