Ich habe eine benutzerdefinierte Ansicht und in der onDraw()
, versuche ich, Bitmap-Maskierung durchzuführen. Ich habe eine squareBitmap
(rote Farbe), die die gesamte Ansicht füllt, und ich habe eine circleBitmap
(blaue Farbe), die als Maske fungiert. Ich verwende den Modus: PorterDuff.Mode.DST_IN
.Android Bitmap-Maskierung (Xfermode) hinterlässt einen undurchsichtigen schwarzen Hintergrund hinter
Das Ergebnis, das ich erwarte, ist ein RED gefüllter Kreis. Ich bekomme das, aber ich bekomme auch einen undurchsichtigen SCHWARZEN Hintergrund. Ich möchte diesen undurchsichtigen Hintergrund nicht, sondern sollte transparent sein. Figure 1
ist das Ergebnis, das ich habe, und Figure 2
ist das Ergebnis, das ich suche.
Mein Code: (Ich habe alles in onDraw()
für die Zwecke dieser Frage bewegt)
protected void onDraw(Canvas canvas) {
final int width = canvas.getWidth();
final int height = canvas.getHeight();
Bitmap circleBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas circleCanvas = new Canvas(circleBitmap);
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setStyle(Paint.Style.FILL_AND_STROKE);
p.setColor(Color.BLUE);
circleCanvas.drawCircle(width/2, height/2, width/2, p);
p.setColor(Color.RED);
Bitmap squareBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
Canvas squareCanvas = new Canvas(squareBitmap);
final Rect squareRect = new Rect(0, 0, width, height);
squareCanvas.drawRect(squareRect, p);
Paint q = new Paint(Paint.ANTI_ALIAS_FLAG);
canvas.drawBitmap(squareBitmap, 0, 0, q);
q.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(circleBitmap, 0, 0, q);
q.setXfermode(null);
}
Wohin gehe ich falsch? Wie kann ich diesen schwarzen undurchsichtigen Hintergrund vermeiden?
Try 'DST_OUT' statt' DST_IN'. Oder 'SRC_IN'. –
@ FrankN.Stein Nein, es funktioniert nicht. Jetzt bekomme ich den schwarz gefüllten Kreis und einen roten Hintergrund. Der Hintergrund ist rot wegen der 'QuadratBitmap', aber warum ist der Kreis schwarz? Idealerweise sollte der Kreis transparent sein und daher blau sein (die Farbe des Hintergrundlayouts). – Henry
Sie sollten hier eine Antwort finden: http://ssp.impulsetrain.com/porterduff.html –