0

我尝试在我的项目中添加一些拖放机制。我这样做的方式基本上是每次发生触摸事件时进行两次操作:
首先,根据触摸事件更新我在 onLayout() 内部使用的参数,
其次,调用 requestLayout() 进行刷新。
(我已经使用 OnTouchListener 方法和 View 的 onTouchEvent() 进行了尝试,如下代码所示)

问题是,屏幕上的结果不太好。它给人的感觉是拖动视图存在一些撕裂问题(新绘图在较早结束之前开始)

代码看起来像这样(简化版本):

public class DragAndDrop extends ViewGroup
{
  View touchView;
  float touchX;
  float touchY;

  static int W = 180;
  static int H = 120;

  public DragAndDrop(Context context)
  {
    super(context);

    touchView = new View(context);
    touchView.setBackgroundColor(0xaaff9900);
    addView(touchView);
  }

  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b)
  {
    float width = r - l;
    float height = b - t;

    int centerX = (int) (touchX - W / 2);
    int centerY = (int) (touchY - H / 2);

    touchView.layout(centerX, centerY, centerX + W, centerY + H);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    touchX = event.getX();
    touchY = event.getY();

    requestLayout();
    return true;
  }
}

经过调查,我发现问题在于在 touchListener 方法中调用requestLayout ( )方法。我将该调用移至一个定期触发它的计时器,结果要好得多。

有没有其他人经历过这种情况并且知道更好的方法,而不使用计时器?
我宁愿避免在实际需要时更多地刷新。

谢谢你的帮助!

4

1 回答 1

-1

我认为您是在说您的完整版本在其中涉及子类化View和覆盖onTouchEvent(),在这种情况下请参阅此答案。在我自己event.getX()event.getY()类似拖动实现中,我看到了移动事件,这些事件似乎显示我的触摸在移动时围绕我的手指摆动;和移动就像我真正的手指运动一样流畅event.getRawX()event.getRawY()

顺便说一句,对于原始坐标,最好保存ACTION_DOWN事件的坐标,然后重新计算相对距离以及requestLayout()每次获得ACTION_MOVE事件时。

于 2012-03-12T22:52:19.630 回答