5

ドラッグアンドドロップ機能を実装し、Androidアプリケーションでビットマップを回転させる方法を見つけようとしています。キャンバス上で画像をドラッグして回転できるようにしたい。キャンバスにビットマップを追加する方法は次のとおりです。

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

ここで、x & yはに等しいですevent.getX(); / event.getY();

どうすればこれを達成できますか?

前もって感謝します!:)

4

1 に答える 1

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

回転ではなく、ドラッグアンドドロップの問題のみを解決します。しかし、主なアイデアはローテーションでも機能します。

于 2016-08-31T10:51:29.170 に答える