大家在工作中可能会需要用到长按快速加减的操作,以下代码可以帮忙解决这个问题
实现代码
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()
}