2010-03-31 6 views
7

Ich fange gerade mit der Android-Entwicklung an und komme aus der JavaScript/HTML-Welt, also untersuche ich gerade die Möglichkeiten des Android SDK.Composite-Operationen in Android Canvas

Der HTML 5 Canvas unterstützt Composite-Operationen (Siehe here).

Ist dies in einem Android Canvas möglich? Ich habe die API der Canvas-Klasse gescannt, konnte aber nichts Nützliches finden. Ich brauche zumindest die zusammengesetzte Operation "source-in" oder (wenn dies nicht möglich ist) "source-atop".

Antwort

8

Die Zusammensetzung wird durch Zeichnen auf eine Canvas mit einer Paint, die eine PorterDuffXfermode verwendet behandelt.

Paint p=new Paint(); 
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); 
canvas.drawBitmap(bitmap, 0, 0, p); 

Weitere Informationen finden Sie unter here. Ich habe es auch geschafft, onPaint zu überschreiben, so dass wir diese Komposition auf Elemente anwenden können, die sich selbst zeichnen.

1

Ich habe nicht in diese Art von Operationen zuvor untersucht, aber ich denke, es gibt eine Möglichkeit, sie mit der Rect Form zu tun. Sie können Rechtecke definieren, um festzulegen, welche Bereiche in den Canvas gezeichnet oder aus dem Quellbild entfernt werden sollen, und in der Klasse Rect sind einige Vergleichsfunktionen integriert. Um beispielsweise eine Quelleneingabe zu imitieren, könnten Sie setIntersect(Rect boundingBoxOfSource, Rect boundingBoxOfDestination) verwenden, damit Ihr neues Rechteck nur die Schnittfläche der beiden Bilder enthält. Dann können Sie dieses Rechteck als Argument in einem der Zeichenbefehle von Canvas verwenden und angeben, dass nur die Pixel aus dem Quellbild genommen werden sollen, die sich innerhalb dieses Rechtecks ​​befinden. Sie steuern dann die Zeichnung in der Z-Achse nach der Reihenfolge, in der die Zeichenbefehle ausgeführt werden.

+0

Einfaches Clipping mit Rechtecken ist nicht genug. Ich brauche komplexe Alphamasken. – kayahr

+0

Ich ging gerade auf die zwei Beispielbilder, die in Ihrem Link gezeigt werden - die Quellen-in und Quelle-oben-Beispiele schienen keine Alpha-Maskierung aufzuweisen. Wenn Sie danach suchen, weiß ich nicht, wie ich es machen soll. Canvases unterstützen Transparenz zwischen "Schichten" von Bildern, die übereinander gezeichnet werden, vorausgesetzt, dass die Bilder bereits diese Transparenz eingebaut haben, aber jemand mit mehr Erfahrung muss uns sagen, ob es möglich ist, das Mischen automatisch durchzuführen. –

1

Ich habe es selbst gefunden. Der PorterDuffXfermode implementiert alle diese zusammengesetzten Modi.