刚开始只按移动距离做了处理,之后出现了部分手机点击没有反应问题
private var downRawX = 0f
private var downRawY: kotlin.Float = 0f
private var downViewX: kotlin.Float = 0f
private var downViewY: kotlin.Float = 0f
private var isMoving = false
private var startClickTime: Long = 0
private val MAX_CLICK_DURATION = 200
dataBinding.tvSaoma.setOnTouchListener { v, event ->
val X = event.rawX.toInt()
val Y = event.rawY.toInt()
when (event.action and MotionEvent.ACTION_MASK) {
MotionEvent.ACTION_DOWN -> {
startClickTime = System.currentTimeMillis()
downRawX = event.rawX
downRawY = event.rawY
downViewX = v.left.toFloat()
downViewY = v.top.toFloat()
isMoving = false
}
MotionEvent.ACTION_MOVE -> {
val deltaX: Int = (X - downRawX).toInt()
val deltaY: Int = (Y - downRawY).toInt()
val distance = Math.sqrt(
Math.pow(
(deltaX - downRawX).toDouble(),
2.0
) + Math.pow((deltaY - downRawY).toDouble(), 2.0)
).toFloat()
if (distance > 10 && System.currentTimeMillis() - startClickTime > MAX_CLICK_DURATION) { // 超过10个像素在移动
isMoving = true
}
val viewWidth = v.width
val viewHeight = v.height
val layoutParams = RelativeLayout.LayoutParams(viewWidth, viewHeight)
layoutParams.leftMargin = (downViewX + deltaX).toInt()
layoutParams.topMargin = (downViewY + deltaY).toInt()
v.layoutParams = layoutParams
}
MotionEvent.ACTION_UP -> {
if (!isMoving) {
//手指点击
zxingScan()
}
}
}
true // 重要:返回true表示事件已处理,不再传递给其他组件。
}