Intento borrar partes de un mapa de bits en mi aplicación Android utilizando Porter-Duff Xfermodes.Borrar partes del mapa de bits utilizando el modo PorterDuff
Tengo un fondo verde que se superpone con un mapa de bits azul. Cuando toco la pantalla, se supone que se creará un "agujero" en el mapa de bits superpuesto, haciendo que el fondo verde sea visible. En lugar de un agujero, mi código actual produce un punto negro.
A continuación se muestra mi código. ¿Alguna idea, qué estoy haciendo mal aquí?
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new DrawView(this));
}
public class DrawView extends View implements OnTouchListener {
private int x = 0;
private int y = 0;
Bitmap bitmap;
Canvas bitmapCanvas;
private final Paint paint = new Paint();
private final Paint eraserPaint = new Paint();
public DrawView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
// Set background
this.setBackgroundColor(Color.GREEN);
// Set bitmap
bitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.RGB_565);
bitmapCanvas = new Canvas();
bitmapCanvas.setBitmap(bitmap);
bitmapCanvas.drawColor(Color.BLUE);
// Set eraser paint properties
eraserPaint.setAlpha(0);
eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
eraserPaint.setAntiAlias(true);
}
@Override
public void onDraw(Canvas canvas) {
bitmapCanvas.drawColor(Color.BLUE);
bitmapCanvas.drawCircle(x, y, 10, eraserPaint);
canvas.drawBitmap(bitmap, 0, 0, paint);
}
public boolean onTouch(View view, MotionEvent event) {
x = (int) event.getX();
y = (int) event.getY();
invalidate();
return true;
}
}
Muchas gracias Josh! Crear el mapa de bits usando Bitmap.Config.ARGB_8888 en lugar de Bitmap.Config.RGB_565 resolvió el problema. En cuanto a efectivos: planeo aplicar el alfa de una ruta de pintura a mi mapa de bits en primer plano como siguiente paso. ¿Qué enfoque sugeriría en lugar de utilizar Porter-Duff con respecto al rendimiento del dibujo? – Philipp
1. Cuando obtenga eventos táctiles en onTouch, use drawPath de vez en cuando para dibujar una ruta negra a una imagen transparente. Este es tu mapa de bits borrador. Si todavía no lo hace, la aplicación FingerPaint en demostraciones de API tiene un bonito código de ejemplo. 2. En onDraw, aplique el mapa de bits del borrador al mapa de bits azul ORIGINAL con el método PorterDuff adecuado. Esto cortará un todo en el mapa de bits azul con la forma de lo que has borrado (el camino negro) hasta el momento. 3. Todavía en onDraw, coloque el mapa de bits verde en la pantalla, seguido por el mapa de bits azul recién cortado. – Josh
Tenga en cuenta que lo anterior podría ser costoso en cada ciclo de extracción: busque en las regiones de recorte para limitar el área que está actualizando a solo lo que el usuario ha cambiado en el mapa de bits del borrador. – Josh