我在画布上有一个要保持不变的位图(backgroundBitmap),另一个是我希望用户能够将其拖到backgroundBitmap上方的较小的位图(draggableBitmap)。 (我的意思是在z轴上是“上方”)。

我的想法是,我只需要重新绘制每个ACTION_MOVE的背景即可。当我使用纯色进行此操作时,它可以完美工作。当我重画backgroundBitmap而不是颜色时,backgroundBitmap仍然可见,但是draggableBitmap只是沿着拖动路径重复自身。为什么纯色可以“清除”图像,而位图却不能?

编辑:
非常感谢Steve K的帮助。我更新了以下代码以反映到目前为止的进展。此时唯一的问题是拖动开始后图像完全变黑。这与将背景位图设置为可变有关吗?没有它,我遇到了可变性错误。

package com.example.drawing;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class DrawingView extends View {
    // drawing and canvas paint
    private Paint canvasPaint;
    // canvas
    private Canvas drawCanvas;
    // canvas bitmap
    private Bitmap backgroundBitmap, draggableBitmap;

    public DrawingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setupDrawing();
    }

    private void setupDrawing() {
        canvasPaint = new Paint();
        canvasPaint.setColor(Color.TRANSPARENT);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        BitmapFactory.Options opt1 = new BitmapFactory.Options();
        opt1.inMutable = true;
        opt1.inSampleSize = 4;

        BitmapFactory.Options opt2 = new BitmapFactory.Options();
        opt2.inMutable = true;

        backgroundBitmap = BitmapFactory.decodeFile("/storage/emulated/0/DCIM/Camera/20140901_223343.jpg", opt1);

        draggableBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.draggable_image, opt2);

        drawCanvas = new Canvas(backgroundBitmap);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(backgroundBitmap, 0, 0, null);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // Nothing here
                break;
            case MotionEvent.ACTION_MOVE:
                drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                drawCanvas.drawBitmap(backgroundBitmap, 0, 0, null);
                drawCanvas.drawBitmap(draggableBitmap, touchX, touchY, null);
                break;
            case MotionEvent.ACTION_UP:
                // Nothing here
                break;
            default:
                return false;
        }

        invalidate();
        return true;
    }
}

最佳答案

是的,当您创建画布时,它必须具有可变的位图才能绘制。当您尝试将backgroundBitmap绘制到以backgroundBitmap作为其目标初始化的画布时,它绘制了backgroundBitmap,但是要理解的重要一点是,由于它是您的目标绘图表面,所以backgroundBitmap所包含的实际上就是您所看到的图片(绘制到画布上的所有内容的总和),因此当您再次绘制时,什么也没有发生。通过使用backgroundBitmap初始化画布,您绘制到画布上的所有内容都会更改backgroundBitmap。您需要干净的表面来吸引自己,这不是您的精灵之一。

09-28 05:12