これが私の解決策です。おそらくそれはあまりクールではないので、誰かが提案してくれたら私と共有してください。
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;
}
});
回転ではなく、ドラッグアンドドロップの問題のみを解決します。しかし、主なアイデアはローテーションでも機能します。