Zeichnung auf Leinwand - PorterDuff.- Modus.KLAR zieht schwarz! Warum?
Ich versuche, eine benutzerdefinierte Ansicht erstellen, die funktioniert einfach: es ist eine Bitmap, die offenbart durch arc-Pfad - von 0deg auf 360deg. Grad verändern sich mit einigen FPS.
Also machte ich eine benutzerdefinierte Ansicht mit überschrieben onDraw()
Methode:
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
arcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
canvas.drawArc(arcRectF, -90, currentAngleSweep, true, arcPaint);
arcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, circleSourceRect, circleDestRect, arcPaint);
}
arcPaint
ist wie folgt initialisiert:
arcPaint = new Paint();
arcPaint.setAntiAlias(true);
arcPaint.setColor(Color.RED); //Color doesn't matter
Nun, alles zieht toll, aber... der hintergrund ist SCHWARZ in der gesamten Ansicht.
Wenn ich canvas.drawColor(..., PorterDuff.Mode.DST)
und weglassen canvas.drawBitmap()
- die arc ist richtig gezeichnet auf dem transparenten hintergrund.
Meine Frage ist - wie man PorterDuff
Modi zu machen, arbeiten mit Transparenz?
Natürlich bitmap
32-bit-PNG mit alpha-Kanal.
InformationsquelleAutor der Frage cadavre | 2013-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
PorterDuff.Mode.CLEAR
funktioniert nicht mit hardware-Beschleunigung. Setzen Sie einfachFunktioniert perfekt für mich.
InformationsquelleAutor der Antwort Nitesh Tarani
Verwenden Sie diese Anweisung, während der Initialisierung des view
InformationsquelleAutor der Antwort Mukesh Kumar
Alles ok ist in Ihrem code außer eine Sache: Sie bekommen schwarzen hintergrund, weil Ihre Fenster undurchsichtig ist. Zu erreichen, transparentes Ergebnis zeichnen Sie auf ein anderes bitmap. In Ihrer onDraw-Methode bitte erstellen Sie eine neue bitmap und alles tun, die Mitarbeiter auf. Danach zeichnen Sie diese bitmap auf das canvas.
Details und Beispiel-code bitte Lesen Sie diese meine Antwort:
InformationsquelleAutor der Antwort Robert
lösen unerwünschte
PorterDuff
Effektverwenden Sie die einfachste Methode auf den ersten, wie der OP das problem, eine
Path.arcTo(*, *, *, *, false)
ist genug -- Hinweis: es istarcTo
, nichtaddArc
, und diefalse
bedeutetno forceMoveTo
vor der Zugabe arc -- es gibt keine Notwendigkeit fürPorterDuff
.wenn Sie wirklich brauchen, PorterDuff, vor allem für komplexe Farb-morphing, wie Farbverläufe, blending, nicht zeichnen, Farbe oder Form oder bitmap mit PorterDuff Filterwirkung direkt an das Standard-canvas in
onDraw(Canvas)
verwenden einige Pufferung/Ziel-bitmap[s] mit alpha Kanal--undsetHasAlpha(true)
-- zum speichern des Ergebnisses aus PorterDuff filtern, endlich zeichnen Sie die bitmap, um die Standard-Leinwand, ohne die Anwendung von filtern außer matrix ändern.hier ein lauffähiges Beispiel zu erstellen, Grenze verwischt-Runde Bild:
einige Hinweise:
1, dieser Blick reicht
ImageView
nichtView
gibt es einige Unterschiede.2, warum
drawWithLayers
--saveLayer
odersaveLayerAlpha
-- ist unrecommended: Sie sind unsicher, manchmal nicht richtig funktioniert(Karte transparent schwarz), insbesondere fürView
derenonDraw(Canvas)
leer ist, währendImageView.onDraw(Canvas)
verwendet eineDrawable
ziehen einige; b, Sie sind teuer, Sie reservierenoff-screen bitmap
zum speichern von temporären Zeichnung ergeben, und es gibt keine klaren Hinweise auf eine beliebige Ressource recycling-Mechanismus.3, verwenden Sie Ihre eigenen bitmap - [s], ist besser für die angepasste Ressourcen-recycling.
Einige Leute sagten, es ist unmöglich, verwendet PorterDuff ohne allocation bitmap[s] jede Zeichnung, da die bitmap Breite, Höhe kann nicht bestimmt werden, vor Zeichnung/layout/Messen.
Sie KÖNNEN die Pufferung verwenden bitmap[s] für PorterDuff Zeichnung:
auf den ersten, reservieren Sie etwas groß genug, bitmap[s].
zeichnen Sie dann auf die bitmap[s] mit einigen matrix.
und die, zeichnen der bitmap[s] in eine Ziel-bitmap mit einigen matrix.
endlich ziehen die Ziel-bitmap in Leinwand, mit einigen matrix.
einige Leute empfehlen, setLayerType ("Ansicht".LAYER_TYPE_SOFTWARE, null), das ist keine option für mich, da es wird Ursache onDraw(Canvas) werden in einer Schleife aufgerufen.
Ergebnis Bild
Quelle Bild
InformationsquelleAutor der Antwort zdave
Wenn Sie über eine solide Farbe, hintergrund, alles, was Sie tun müssen, ist, legen Sie Farbe auf Ihre Hintergrundfarbe. Zum Beispiel, wenn Sie einen weißen hintergrund, die Sie tun können:
Allerdings, wenn Sie benötigen, löschen Sie eine Zeile mit einem transparenten hintergrund, die Sie versuchen, diese:
Um zu zeichnen, mit einer transparenten Farbe, die Sie verwenden müssen, Malen setXfermode was nur funktioniert, wenn Sie ein bitmap auf das canvas. Wenn Sie Folgen Sie den nachstehenden Schritten, sollten Sie das gewünschte Ergebnis zu erhalten.
Erstellen, eine Leinwand und legen Sie die bitmap.
Nun sollten Sie in der Lage sein, ziehen mit einer transparenten Farbe mit:
InformationsquelleAutor der Antwort Ishan
speichern Sie einfach die Leinwand und wiederherstellen nach
in diesem Fall erste Rechteck wird als Ziel für https://developer.android.com/reference/android/graphics/PorterDuff.Mode und das zweite Rechteck als Quelle
InformationsquelleAutor der Antwort Mykola Tychyna