android 实现长按快速加减事件

145 阅读1分钟

大家在工作中可能会需要用到长按快速加减的操作,以下代码可以帮忙解决这个问题

实现代码

import android.os.Handler
import android.os.Looper
import android.view.MotionEvent
import android.view.View
import java.util.UUID


/**
 * Author: lujianfei
 * Date: 2024/1/22 9:50
 * Description: 持续长按事件
 */

class LongClickHelper {

    private val LONG_PRESS_DURATION = 100L
    private val LONG_PRESS_DELAY = 800L

    private var views = arrayListOf<ClickView>()

    private var handler = Handler(Looper.getMainLooper())

    /**
     * 注册持续长按事件
     */
    fun registerListener(clickView:ClickView, onLongPress:()->Unit) {
        clickView.view.tag = UUID.randomUUID().toString()
        clickView.runnableLongPress = object : Runnable {
            override fun run() {
                clickView.isLongClicked = true
                onLongPress.invoke()
                handler.postDelayed(this, LONG_PRESS_DURATION)
                clickView.result = true
            }
        }
        clickView.view.setOnTouchListener { v, event ->
            when (event.action) {
                MotionEvent.ACTION_DOWN-> { // 按下事件
                    clickView.isLongClicked = false
                    clickView.runnableLongPress?.let {
                        handler.postDelayed(it, LONG_PRESS_DELAY)
                    }
                    clickView.result = true
                }
                MotionEvent.ACTION_MOVE-> { // 移动事件
                    clickView.result = true
                }
                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL-> {
                    clickView.runnableLongPress?.let { // 移除长按事件
                        handler.removeCallbacks(it)
                    }
                    if (!clickView.isLongClicked) { // 不影响点击事件
                        v.performClick()
                    }
                    clickView.result = false
                }
            }
            clickView.result
        }
        views.add(clickView)
    }

    fun removeListener(view:ClickView) {
        view.runnableLongPress?.let {
            handler.removeCallbacks(it)
        }
        views.remove(view)
    }

    /**
     * 清空事件回调
     */
    fun clearListener() {
        views.forEach {
            it.runnableLongPress?.let {
                handler.removeCallbacks(it)
            }
        }
        views.clear()
    }
}

data class ClickView(val view:View, var isLongClicked:Boolean = false, var result:Boolean = false, var runnableLongPress:Runnable?= null)

用法

先声明对象

private val mLongClickHelper by lazy { LongClickHelper() }

再到需要监听事件的地方这样使用

mLongClickHelper.registerListener(clickView = ClickView(tvCountAdd), onLongPress = {
        viewModel?.performAddClick()
})

界面销毁时记得释放

override fun onDestroy() {
    mLongClickHelper.clearListener()
    super.onDestroy()
}