Ich habe versucht, dies die ganze Nacht herauszufinden, aber Antworten auf Google beziehen sich auf sehr spezifische Probleme in Bezug auf Android Canvas und ich habe keine 101 Erklärungen zu diesem Thema gefunden. Sogar die Android-Dokumentation verwendet Bitmaps, anstatt Formen zu zeichnen.Worauf beziehen sich die Quelle und das Ziel von PorterDuff beim Zeichnen auf Leinwand?
Spezifisches Problem:
Ich brauche einen ovalen und einen Weg auf die Leinwand zu zeichnen. Und nach documentation Farbe Quelle mit einer Farbe, Ziel aus einer anderen Farbe und überlappenden Bereich, entweder Quelle oder Ziel in, eine dritte Farbe. Ich versuche das alles in einem Offscreen-Canvas zu machen. Bei einigen der obigen Schritte treten jedoch Probleme auf und werden schlimmer, wenn man versucht, sie in irgendeiner Weise zu kombinieren.
-Code -
Bitmap bmp = Bitmap.CreateBitmap (720, 720, Bitmap.Config.Argb8888); Canvas c = new Canvas (bmp); Paint paint = new Paint(); paint.SetARGB (255, 255, 0, 0); c.DrawOval (200, 200, 520, 520, paint); //assumed destination paint.SetARGB (255, 0, 0, 255); paint.SetXfermode (new PorterDuffXfermode (PorterDuff.Mode.*)); //replace mode here paint.SetStyle (Paint.Style.Fill); Path path = new Path(); path.MoveTo (c.Width/2f, c.Height/2f); foreach (var m in measurements) { //calculations float x = xCalculatedValue float y = yCalculatedValue path.LineTo (x, y); } path.LineTo (c.Width/2f, c.Height/2f); c.DrawPath (path, paint); //assumed source
Quelle aus -
Dieser stattdessen zieht, was XOR soll ziehen.
- Reiseziel aus -
Dies funktioniert wie erwartet.
- Quelle in -
Zeichnet welcher Quelle oben auf sollte.
- Destination in -
Zeichnet was Ziel sollte.
Weitere allgemeine Frage:
Was in diesem Zusammenhang beziehen sich Quell- und Ziel? Intuitiv würde ich davon ausgehen, dass das Ziel der aktuelle Zustand der Bitmap und die Quelle die von canvas.Draw * und Paint PortedDuff.Mode hinzugefügte Matrix ist. Aber das scheint nicht der Fall zu sein.
EDIT: Dies ist im Grunde der Effekt, nach dem ich bin, wo der "Stern" ist ein dynamischer Pfad. Je nach Überlappung drei verschiedene Farben.
EDIT 2: Yorker Shen hat einen tollen Job die eigentliche Frage zu beantworten. Aber für alle, die einen ähnlichen Effekt erzielen möchten, ist hier der endgültige Code.
Bitmap DrawGraphBitmapOffscreen()
{
Bitmap bmp = Bitmap.CreateBitmap (720, 720, Bitmap.Config.Argb8888);
Canvas c = new Canvas (bmp);
// Replace with calculated path
Path path = new Path();
path.MoveTo (c.Width/2f, c.Height/2f);
path.LineTo (263, 288);
path.LineTo (236, 202);
path.LineTo (312, 249);
path.LineTo (331, 162);
path.LineTo (374, 240);
path.LineTo (434, 174);
path.LineTo (431, 263);
path.LineTo (517, 236);
path.LineTo (470, 312);
path.LineTo (557, 331);
path.LineTo (479, 374);
path.LineTo (545, 434);
path.LineTo (456, 431);
path.LineTo (483, 517);
path.LineTo (407, 470);
path.LineTo (388, 557);
path.LineTo (345, 479);
path.LineTo (285, 545);
path.LineTo (288, 456);
path.LineTo (202, 483);
path.LineTo (249, 407);
path.LineTo (162, 388);
path.LineTo (240, 345);
path.LineTo (174, 285);
path.LineTo (263, 288);
path.Close();
Paint paint = new Paint();
paint.SetARGB (255, 255, 0, 0);
paint.SetStyle (Paint.Style.Fill);
c.DrawPath (path, paint);
paint.SetARGB (255, 0, 0, 255);
paint.SetXfermode (new PorterDuffXfermode (PorterDuff.Mode.SrcIn));
c.DrawOval (200, 200, 520, 520, paint);
paint.SetARGB (255, 255, 255, 255);
paint.SetXfermode (new PorterDuffXfermode (PorterDuff.Mode.DstOver));
c.DrawOval (200, 200, 520, 520, paint);
return bmp;
}
Was ist der gewünschte Effekt, zeichnen Sie ein Oval und einen Pfad auf der Leinwand? Warum benutzt du 'PorterDuffXfermode'? Wenn Sie nur ein Oval und einen Pfad zeichnen müssen, müssen Sie PorterDuffX nicht verwenden. –
Ich habe ein Bild hinzugefügt, um zu erklären, was ich versuche zu tun. Ich bin mir nicht sicher, ob Alpha-Compositing die beste Lösung ist, aber es ist die einzige, die mir in den Sinn kam. Und mehr als eine tatsächliche Lösung für das Problem, würde ich gerne verstehen, was Quelle und Ziel im Zusammenhang mit dem Zeichnen von Dingen nacheinander auf einer Leinwand beziehen. – JaanTohver
Sie möchten also ein Oval und ein Polygon zeichnen und dann 'PorterDuffXfermode' verwenden, um den Effekt in dem Bild zu erzielen, das Sie geposted haben? –