Android Studio拖拽控件距离异常:仅移动光标一半距离求助
排查Android拖拽方块偏移一半的问题
这种拖拽时方块只移动光标一半距离的问题我之前踩过坑!大概率是触摸事件处理时的坐标逻辑或者视图状态出了问题,给你几个具体的修复方向:
统一触摸坐标的计算逻辑
最常见的原因是混合使用了相对坐标和绝对坐标,或者偏移量计算时没有正确记录初始状态。比如在ACTION_DOWN时记录了视图内的相对坐标event.getX(),但ACTION_MOVE时却用了屏幕绝对坐标event.getRawX()来计算偏移,就会导致位置计算错误。
正确的做法是统一坐标体系,比如都用视图相对坐标:private float startTouchX, startViewX; private float startTouchY, startViewY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: // 记录触摸点在视图内的初始位置,以及视图当前的位置 startTouchX = event.getX(); startTouchY = event.getY(); startViewX = v.getX(); startViewY = v.getY(); return true; case MotionEvent.ACTION_MOVE: // 计算触摸点的偏移量,再叠加到视图初始位置上 float dx = event.getX() - startTouchX; float dy = event.getY() - startTouchY; v.setX(startViewX + dx); v.setY(startViewY + dy); return true; } return super.onTouchEvent(event); }排查父容器的触摸拦截
如果你的方块视图嵌套在ScrollView、RecyclerView这类会拦截触摸事件的容器里,父容器可能会截取部分触摸事件,导致你的视图接收到的坐标不准确。可以在ACTION_DOWN时给父容器设置禁止拦截:case MotionEvent.ACTION_DOWN: // ... 其他初始化代码 v.getParent().requestDisallowInterceptTouchEvent(true); return true;检查动画或属性动画的干扰
如果你的方块之前有未结束的属性动画(比如ObjectAnimator),setX()/setY()的设置会被动画的帧更新覆盖,导致视觉上移动距离异常。可以在触摸开始时清除所有动画:case MotionEvent.ACTION_DOWN: // ... 其他初始化代码 v.clearAnimation(); // 如果是属性动画,还需要取消对应的Animator if (mDragAnimator != null) { mDragAnimator.cancel(); } return true;确认没有重复设置触摸监听
虽然少见,但如果你的方块视图被多次设置了触摸监听器,多个监听器同时处理移动逻辑,可能会导致移动效果被叠加或抵消,出现“移动一半”的假象。可以检查代码中是否有重复调用setOnTouchListener()的情况。
内容的提问来源于stack exchange,提问作者Drew Pesall
相关产品推荐
相关产品推荐

