2012-02-23 80 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; 
     } 
    };