我尝试在我的项目中添加一些拖放机制。我这样做的方式基本上是每次发生触摸事件时进行两次操作:
首先,根据触摸事件更新我在 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 (
)方法。我将该调用移至一个定期触发它的计时器,结果要好得多。
有没有其他人经历过这种情况并且知道更好的方法,而不使用计时器?
我宁愿避免在实际需要时更多地刷新。
谢谢你的帮助!