2010-03-31 12 views
7

Je ne fais que commencer avec le développement Android et je viens du monde JavaScript/HTML donc j'étudie actuellement les possibilités du SDK Android.Opérations composites sur Android Canvas

Le canevas HTML 5 prend en charge les opérations composites (voir here).

Est-ce possible sur une toile Android? J'ai scanné l'API de la classe Canvas mais je n'ai rien trouvé d'utile. J'ai besoin au moins de l'opération composite "source-in" ou (si ce n'est pas possible) "source-atop".

Répondre

8

Composition est assurée par le dessin sur un Canvas avec un Paint qui utilise un PorterDuffXfermode.

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

Voir here pour plus d'informations. J'ai également réussi à remplacer onPaint afin que nous puissions appliquer cette composition à des éléments qui dessinent eux-mêmes.

1

Je n'ai pas envisagé de faire ce genre d'opérations auparavant, mais je pense qu'il y a un moyen de le faire en utilisant la forme Rect. Vous pouvez définir des rectangles pour délimiter les zones qui doivent être dessinées dans la zone de dessin ou lesquelles doivent être supprimées de l'image source, et la classe Rect dispose de fonctions de comparaison intégrées. Par exemple, pour imiter une source, vous pouvez utiliser setIntersect(Rect boundingBoxOfSource, Rect boundingBoxOfDestination) pour que votre nouveau rectangle n'ait que la zone intersectée des deux images. Vous pouvez ensuite utiliser ce rectangle comme argument dans l'une des commandes de dessin du Canevas, en lui disant de ne prendre que les pixels de l'image source qui se trouvent à l'intérieur de ce rectangle. Vous contrôlez ensuite le dessin dans l'axe Z par l'ordre dans lequel les commandes draw sont exécutées.

+0

Un simple écrêtage avec des rectangles ne suffit pas. J'ai besoin de masques alpha complexes. – kayahr

+0

J'allais juste sur les deux exemples d'images montrés dans votre lien - les exemples source-in et source-atop ne semblaient pas avoir de masquage alpha. Si c'est ce que vous cherchez, je ne sais pas comment le faire. Les toiles supportent la transparence entre les «couches» d'images dessinées les unes sur les autres à condition que les images aient déjà cette transparence intégrée, mais quelqu'un plus expérimenté devra nous dire s'il est possible de faire le fondu automatiquement. –

1

J'ai trouvé moi-même. Le PorterDuffXfermode implémente tous ces modes composites.