Android 使用 canvas 绘图进行遮罩
Android masking with canvas drawing
我正在尝试通过在 canvas 上画线来创建遮罩。但是,当我完成图像时,它只是原始图像。如果我发送 mask
位图,它会按预期显示并且原始图像是正确的。我怎样才能让遮罩在两个位图之间起作用?
@Override
public void onDraw(Canvas canvas) {
if (lines == null) {
return;
}
Bitmap mask = null;
if(performMask) {
mask = Bitmap.createBitmap((int)getWidth(), (int)getHeight(), Bitmap.Config.RGB_565);
canvas = new Canvas(mask);
}
for (int i = 0; i < lines.size(); i++) {
ArrayList<Point> line = lines.get(i);
for (int j = 1; j < line.size(); j++) {
Point start = line.get(j - 1);
Point end = line.get(j);
canvas.drawLine(start.x, start.y, end.x, end.y, drawingPaint);
}
}
if(performMask) {
performMask = false;
Bitmap result = Bitmap.createBitmap(original.getWidth(), original.getHeight(), Bitmap.Config.ARGB_8888);
Canvas tempCanvas = new Canvas(result);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
tempCanvas.drawBitmap(original, 0, 0, null);
tempCanvas.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(null);
if(maskPerformedListener != null) {
maskPerformedListener.onMaskCompleted(result);
}
}
}
我需要更改此行
mask = Bitmap.createBitmap((int)getWidth(), (int)getHeight(), Bitmap.Config.RGB_565);
至
mask = Bitmap.createBitmap((int)getWidth(), (int)getHeight(), Bitmap.Config.RGB_8888);
原来你需要 alpha 层才能工作。
我正在尝试通过在 canvas 上画线来创建遮罩。但是,当我完成图像时,它只是原始图像。如果我发送 mask
位图,它会按预期显示并且原始图像是正确的。我怎样才能让遮罩在两个位图之间起作用?
@Override
public void onDraw(Canvas canvas) {
if (lines == null) {
return;
}
Bitmap mask = null;
if(performMask) {
mask = Bitmap.createBitmap((int)getWidth(), (int)getHeight(), Bitmap.Config.RGB_565);
canvas = new Canvas(mask);
}
for (int i = 0; i < lines.size(); i++) {
ArrayList<Point> line = lines.get(i);
for (int j = 1; j < line.size(); j++) {
Point start = line.get(j - 1);
Point end = line.get(j);
canvas.drawLine(start.x, start.y, end.x, end.y, drawingPaint);
}
}
if(performMask) {
performMask = false;
Bitmap result = Bitmap.createBitmap(original.getWidth(), original.getHeight(), Bitmap.Config.ARGB_8888);
Canvas tempCanvas = new Canvas(result);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
tempCanvas.drawBitmap(original, 0, 0, null);
tempCanvas.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(null);
if(maskPerformedListener != null) {
maskPerformedListener.onMaskCompleted(result);
}
}
}
我需要更改此行
mask = Bitmap.createBitmap((int)getWidth(), (int)getHeight(), Bitmap.Config.RGB_565);
至
mask = Bitmap.createBitmap((int)getWidth(), (int)getHeight(), Bitmap.Config.RGB_8888);
原来你需要 alpha 层才能工作。