我在画布上有一个要保持不变的位图(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。您需要干净的表面来吸引自己,这不是您的精灵之一。