2010-03-31 19 views
7

Estoy comenzando con el desarrollo de Android y procedo del mundo de JavaScript/HTML, por lo que actualmente estoy investigando las posibilidades del SDK de Android.Operaciones compuestas en Android Canvas

El lienzo HTML 5 admite operaciones compuestas (consulte here).

¿Es esto posible en un lienzo de Android? Escaneé la API de la clase Canvas pero no pude encontrar nada útil. Necesito al menos la operación compuesta "source-in" o (si esto no es posible) "source-atop".

Respuesta

8

La composición se maneja dibujando en un Canvas con un Paint que usa un PorterDuffXfermode.

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

Ver here para obtener más información. También logré anular onPaint para poder aplicar esta composición a elementos que se dibujan a sí mismos.

1

No he estudiado antes ese tipo de operaciones, pero creo que hay una forma de hacerlo utilizando la forma Rect. Puede definir rectángulos para marcar qué áreas deben dibujarse en el lienzo, o qué sacar de la imagen de origen, y la clase Rect tiene algunas funciones de comparación incorporadas. Por ejemplo, para imitar una fuente de entrada, puede usar setIntersect(Rect boundingBoxOfSource, Rect boundingBoxOfDestination) para hacer que su nuevo rectángulo solo tenga el área intersecada de las dos imágenes. Luego puede usar ese rectángulo como argumento en uno de los comandos de dibujo del Lienzo, diciéndole que solo tome los píxeles de la imagen de origen que están dentro de ese rectángulo. Luego, controla el dibujo en el eje Z en el orden en que se ejecutan los comandos de dibujo.

+0

El recorte simple con rectángulos no es suficiente. Necesito máscaras alfa complejas. – kayahr

+0

Estaba siguiendo las dos imágenes de ejemplo que se muestran en su enlace: los ejemplos de origen y de origen no parecían tener ningún enmascaramiento alfa. Si eso es lo que buscas, de improviso no sé cómo hacerlo. Los lienzos son compatibles con la transparencia entre las "capas" de imágenes dibujadas una encima de la otra, siempre que las imágenes ya tengan esa transparencia incorporada, pero alguien con más experiencia tendrá que decirnos si es posible hacer la fusión automáticamente. –

1

Lo encontré yo mismo. El PorterDuffXfermode implementa todos estos modos compuestos.