我们知道,要实现View的移动有很多种方式,比如offsetLeftAndRight()、layout()、translationX/Y、X/Y、LayoutParams等等,其实大差不大,都是通过偏移量来重新计算位置,且x = left + translationX ; y = top + translationY。但其中translationX/Y就让我有点困惑了,我们先看看用法:
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
if (event == null) return false
var downX = 0f
var downY = 0f
when (event.action) {
MotionEvent.ACTION_DOWN -> {
downX = event.x
downY = event.y
alpha = 1f
}
MotionEvent.ACTION_MOVE -> {
//方法1
//offsetLeftAndRight((event.x - downX).toInt())
//offsetTopAndBottom((event.y - downY).toInt())
//方法2
//用translation来更新位置的话,就得加上原先的translation
//也就是说每次移动translation都生效了,因此就得用原来的translation加上当前
//move的差值?
Log.d("DragView", "offsetX = ${event.x - downX}")
Log.d("DragView", "offsetY = ${event.y - downY}")
Log.d("DragView", "translationX_old = $translationX")
translationX += event.x - downX
translationY += event.y - downY
Log.d("DragView", "translationX_now = $translationX")
}
MotionEvent.ACTION_UP -> {
animate().setInterpolator(DecelerateInterpolator())
.x(-(width / 2).toFloat())
.alpha(0.5f)
.start()
}
}
return true
}
主要在ACTION_MOVE中来处理View的移动,但event.x - downX算的是当前位置和ACTION_DOWN也就是这一事件序列刚开始点击位置的偏移量,但是更新translationX/Y的时候却需要加上原本的translation,有点让人费解,mark一下。