关于设置translationX/Y移动View的问题

我们知道,要实现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一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容