有人知道在拖动位图时是否有一种简单的方法可以使图像捕捉到网格?
目前我可以触摸位图并在屏幕上平滑移动。我希望能够在拖动时将其捕捉到不可见的网格。
答案 0 :(得分:5)
这就是我现在正在完成的应用程序中所做的事情。当用户在屏幕上拖动某些内容时,我会显示一个可见的捕捉网格,并且当拖动完成时,该对象将捕捉到该网格。要显示网格,我的方法是使用我命名为View
的单独自定义GridOverLayView
。它覆盖整个屏幕区域,并且非常简单地在其onDraw()
方法中绘制一个捕捉网格。只有在拖动某些东西时才会显示它。
现在,关于处理拖放的实际Activity
,我定义的一个特定常量是:
static final int SNAP_GRID_INTERVAL = 20;
当拖动对象时,即在event.getAction()==MotionEvent.ACTION_MOVE
内处理OnTouchListener
事件时,我使用以下内容执行对象的位置捕捉到网格:
RelativeLayout.LayoutParams par = (RelativeLayout.LayoutParams) mThingBeingDragged.getLayoutParams();
par.topMargin = Math.round((event.getRawY() - draggedInitialY) / SNAP_GRID_INTERVAL ) * SNAP_GRID_INTERVAL;
par.leftMargin = Math.round((event.getRawX() - draggedInitialX) / SNAP_GRID_INTERVAL ) * SNAP_GRID_INTERVAL;
mThingBeingDragged.setLayoutParams(par);
...其中draggedInitialY
和draggedInitialX
存储初始MotionEvent.ACTION_DOWN
期间记录的初始触摸位置。
进一步的好处是允许被拖动的对象在没有捕捉的情况下移动,但是当用户抬起他们的手指时,仅在.ACTION_UP
中捕捉到网格。在实践中,这感觉使用起来更好。
答案 1 :(得分:4)
private PointF touchDown;
private int gridCellSize = 10;
private OnTouchListener touchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
{
touchDown = new PointF(event.getRawX(), event.getRawY());
break;
}
case MotionEvent.ACTION_MOVE:
{
RelativeLayout.LayoutParams par = (RelativeLayout.LayoutParams) v.getLayoutParams();
float yDeff = ((event.getRawY() - touchDown.y) / gridCellSize ) * gridCellSize;
float xDeff = ((event.getRawX() - touchDown.x) / gridCellSize ) * gridCellSize;
if(Math.abs(xDeff) >= gridCellSize)
{
par.leftMargin += (int)(xDeff / gridCellSize) * gridCellSize;
touchDown.x = event.getRawX() - (xDeff % gridCellSize);
}
if(Math.abs(yDeff) >= gridCellSize)
{
par.topMargin += (int)(yDeff / gridCellSize) * gridCellSize;
touchDown.y = event.getRawY() - (yDeff % gridCellSize);
}
v.setLayoutParams(par);
break;
}
default :
{
break;
}
}
return true;
}
};