拖拽移动并监听点击事件
class DragMoveListener(private val windowManager: WindowManager,private val onClick:()->Unit={}): View.OnTouchListener {private var initialX = 0private var initialY = 0 //初始位置中心偏上private var initialTouchX = 0fprivate var initialTouchY = 0foverride fun onTouch(view: View, event: MotionEvent): Boolean {val params = view.layoutParams as WindowManager.LayoutParamsreturn when (event.action) {MotionEvent.ACTION_DOWN -> {initialX = params.xinitialY = params.yinitialTouchX = event.rawXinitialTouchY = event.rawYtrue}MotionEvent.ACTION_MOVE -> {val deltaX = (event.rawX - initialTouchX).toInt()val deltaY = (event.rawY - initialTouchY).toInt()params.x = initialX + deltaXparams.y = initialY + deltaYwindowManager.updateViewLayout(view, params)true}MotionEvent.ACTION_UP -> {// 判断是否为点击事件(移动距离小于阈值)val tolerance = ViewConfiguration.get(view.context).scaledTouchSlopval 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() })