2012-02-23 2 views
4

Кто-нибудь знает, есть ли простой способ сделать привязку изображений к сетке при перетаскивании растрового изображения?Android Bitmap привязывается к сетке

В данный момент я могу касаться растрового изображения и плавно перемещать его по экрану. Я хочу, чтобы он мог привязываться к невидимой сетке во время перетаскивания.

ответ

4

Это то, что я делаю в приложении, которое я сейчас заканчиваю. Когда пользователь перетаскивает что-то на экран, я показываю видимую сетку привязки, и объект привязывается к этой сетке, когда перетаскивание завершено. Чтобы показать сетку, мой подход заключается в использовании отдельного настраиваемого 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, когда пользователь поднимает их палец. На практике это гораздо приятнее в использовании.

+0

Это блестящий. Очень ясный ответ. Если бы я мог, то был бы выше. Спасибо за ваш быстрый ответ. Я попробую сейчас. – maffo

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; 
     } 
    }; 
Смежные вопросы