2012-02-23 49 views
4

有谁知道在拖动位图时是否有简单的方法使图像捕捉到网格?Android位图捕捉到网格

此刻我可以触摸位图并在屏幕上平滑移动。我希望能够在拖动的时候使其捕捉到无形的网格。

回答

4

这就是我在一个应用程序中所做的工作,我现在刚刚完成。当用户在屏幕上拖动某些东西时,我会显示一个可见的捕捉网格,并在拖动完成时将该对象捕捉到该网格。为了显示网格,我的方法是使用单独的自定义View,我将其命名为GridOverLayView。它覆盖整个屏幕区域,并且它非常简单地在其方法中绘制一个快速网格。只有当某物正在被拖动时才会显示。

现在,关于实际Activity中拖放的处理,我定义一个特定的常数:

static final int SNAP_GRID_INTERVAL = 20; 

当对象被拖动左右,也就是我的OnTouchListener内处理event.getAction()==MotionEvent.ACTION_MOVE事件时

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); 

...其中draggedInitialYdraggedInitialX存储初始触摸断定:我执行使用下面的抢购对象的位置的网格在最初的MotionEvent.ACTION_DOWN期间记录离子。

更好的一点是允许被拖动的物体在没有捕捉的情况下四处移动,但是当用户举起手指时只能在.ACTION_UP中捕捉到网格。在实践中,这使用感觉更好。

+0

这太棒了。非常明确的答案。如果可以的话,会更高。感谢您的快速回复。我现在就试试这个。 – maffo 2012-02-23 08:24:45

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; 
     } 
    };