2012-05-05 4 views
4

Я пытаюсь найти способ реализовать функцию Drag And Drop и поворачивать растровое изображение в приложении для Android. Я хочу, чтобы можно было перетащить изображение на холст и повернуть его. Вот как я добавляю растровое холсте:Android перетащить/повернуть растровое изображение в Canvas

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.dog); 
mCanvas.drawBitmap(bm,x-100,y-100 , mPaint); 

x & y где находятся равна event.getX();/event.getY();.

Любые идеи, как я могу это достичь?

Заранее благодарен! :)

ответ

0

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

public class BitmapDragAndDrop { 

BitmapDragAndDropListener listener; 

public BitmapDragAndDrop(BitmapDragAndDropListener listener) { 
    this.listener = listener; 
} 

public boolean onTouch(View view, MotionEvent motionEvent) { 
    switch (motionEvent.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      listener.onDragStart(motionEvent.getX(), motionEvent.getY()); 
      view.invalidate(); 
      return true; 
     case MotionEvent.ACTION_MOVE: 
      listener.onDragging(motionEvent.getX(), motionEvent.getY()); 
      view.invalidate(); 
      return true; 
     case MotionEvent.ACTION_UP: 
      listener.onDragEnd(listener.onDrop(motionEvent.getX(), motionEvent.getY())); 
      view.invalidate(); 
      return true; 
    } 
    return false; 
} 

public interface BitmapDragAndDropListener { 

    void onDragStart(float x, float y); 

    void onDragging(float x, float y); 

    boolean onDrop(float x, float y); 

    void onDragEnd(boolean isEntered); 
} 

} 


public class YourDrawer implements BitmapDragAndDrop.BitmapDragAndDropListener { 

Bitmap originalImage; //for restore initial state 
Bitmap drawingImage; //bitmap for drawing states. 
Canvas imageCanvas; 
Bitmap objectBitmap; 

public YourDrawer(Bitmap imageBmp, Bitmap objectBmp) { 
    this.originalImage = imageBmp.copy(Bitmap.Config.RGB_565, true); 
    this.drawingImage = imageBmp.copy(Bitmap.Config.ARGB_8888, true); 
    this.imageCanvas = new Canvas(drawingImage); 
    this.objectBitmap = objectBmp; 

    //Draw your object at standard place where you need 
    drawObject(); 
} 

private void restoreImageToOriginal() { 
    imageCanvas.drawBitmap(originalImage, 0, 0, null); 
} 

@Override 
public void onDragStart(float x, float y) { 
    //do whatever you want 
} 

@Override 
public void onDragging(float x, float y) { 
     restoreImageToOriginal(); 
     //Draw bitmap object at new coordinates 
     drawMyObject(x, y); 
    } 
} 

@Override 
public boolean onDrop(float x, float y) { 
    if (isRightPlace(x, y)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

@Override 
public void onDragEnd(boolean isEntered) { 
    restoreImageToOriginal(); 
    if (isEntered) { 
     drawMyObjectAtLastCoordinates(); 
    } 
} 

public Bitmap getDrawingBitmap() { 
    return drawingImage; 
} 

} 

Ofc код не копировать и вставлять. Вам нужно добавить к нему свою реализацию.

В главном классе (фрагмент или активность) можно инициализировать этот код, как это:

YourDrawer yourDrawer = 
      new YourDrawer(originalImage, objectBitmap); 
    onTouchListener 
      = new BitmapDragAndDrop(yourDrawer); 
    imageView.setImageBitmap(yourDrawer.getDrawingBitmap())); 

    imageView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      if (onTouchListener != null) 
       onTouchListener.onTouch(view, motionEvent); 
      return false; 
     } 
    }); 

Это решает только перетаскивание проблемы, не вращается. Но основная идея будет работать даже для вращения.

Смежные вопросы