class DragMoveListener(private val windowManager: WindowManager,private val onClick:()->Unit={}): View.OnTouchListener {
private var initialX = 0
private var initialY = 0 //初始位置中心偏上
private var initialTouchX = 0f
private var initialTouchY = 0f
override fun onTouch(view: View, event: MotionEvent): Boolean {
val params = view.layoutParams as WindowManager.LayoutParams
return when (event.action) {
MotionEvent.ACTION_DOWN -> {
initialX = params.x
initialY = params.y
initialTouchX = event.rawX
initialTouchY = event.rawY
true
}
MotionEvent.ACTION_MOVE -> {
val deltaX = (event.rawX - initialTouchX).toInt()
val deltaY = (event.rawY - initialTouchY).toInt()
params.x = initialX + deltaX
params.y = initialY + deltaY
windowManager.updateViewLayout(view, params)
true
}
MotionEvent.ACTION_UP -> {
// 判断是否为点击事件(移动距离小于阈值)
val tolerance = ViewConfiguration.get(view.context).scaledTouchSlop
val deltaX = (event.rawX - initialTouchX).toInt()
val deltaY = (event.rawY - initialTouchY).toInt()
if (abs(deltaX) < tolerance && abs(deltaY) < tolerance) {
view.performClick() // 触发点击事件
onClick.invoke()
}
true
}
else -> false
}
}
}
使用方式
view.setOnTouchListener(DragMoveListener(windowManager) { sharedViewModel.triggerClick() })

被折叠的 条评论
为什么被折叠?



