Próbuję usunąć części mapy bitowej w mojej aplikacji Android, używając Porter-Duff Xfermodes.Wymazywanie części bitmapowych przy użyciu trybu PorterDuff
Mam zielone tło, na które nałożona jest niebieska bitmapa. Kiedy dotknę ekranu, ma powstać "dziura" w nakładającej się mapie bitowej, dzięki czemu widoczne jest zielone tło. Zamiast dziury mój obecny kod tworzy czarną kropkę.
Poniżej znajduje się mój kod. Jakieś pomysły, co tu robię źle?
/** 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;
}
}
Bardzo dziękuję Josh! Utworzenie Bitmapy za pomocą Bitmap.Config.ARGB_8888 zamiast Bitmap.Config.RGB_565 rozwiązało problem. Odnośnie efektów: planuję zastosować alfa ścieżki farby do mojej nowej mapy bitowej jako kolejny krok. Jakie podejście sugerowałbyś zamiast używania Porter-Duff w zakresie wydajności rysowania? – Philipp
1. Gdy otrzymujesz zdarzenia dotyku w onTouch, od czasu do czasu użyj drawPath, aby narysować czarną ścieżkę do przezroczystego obrazu. To jest twoja mapa bitowa z gumką. Jeśli jeszcze tego nie robisz, aplikacja FingerPaint w demonstracjach API ma przykładowy kod. 2. W onDraw, zastosuj swoją mapę bitową gumki do ORYGINALNEJ niebieskiej bitmapy za pomocą odpowiedniej metody PorterDuff. W ten sposób wycinamy całość w niebieskiej mapie bitowej w kształcie tego, co wymazaliśmy (czarna ścieżka). 3. Wciąż w onDraw, umieść zieloną bitmapę na ekranie, a następnie nowo wyciętą niebieską bitmapę. – Josh
Należy pamiętać, że powyższe może być kosztowne w każdym cyklu rysowania - spójrz na obszary obcinania, aby ograniczyć aktualizowany obszar do tylko tego, co użytkownik zmienił w mapie bitowej gumki. – Josh