2012-02-14 13 views
17

Aquí es cómo crear un área de recorte la forma de un círculo:En Android, ¿cómo hago áreas de recorte con formas extrañas?

Path path = new Path(); 
path.addCircle(200,200,100,Direction.CW); 
c.clipPath(path); // c is a Canvas 

Ahora hay un área de recorte en el lienzo de dibujo que impide cualquier cosa fuera de los límites de ese círculo. Pero, ¿y si quiero que el área de recorte tenga la forma de una rosquilla (o lo que sea)?

Intenté jugar con la creación de una segunda ruta de acceso y usar toggleInverseFillType en ella y luego agregar eso a la ruta de acceso original, pero eso no parece funcionar.

Como alternativa, en lugar de utilizar una ruta de acceso, ¿es posible crear un mapa de bits para usar como máscara y establecerlo como una máscara de recorte en el lienzo de alguna manera?

EDITAR: La respuesta es exactamente lo que necesitaba con una pequeña adición. Al realizar operaciones múltiples en un lienzo, siempre use Op.REPLACE en la primera llamada de clipPath. Eso reemplazará cualquier clipPath existente en ese lienzo.

Como referencia, esto es lo que descubrí que significan los 6 diferentes valores Region.Op. Imagine un diagrama de venn con 2 círculos. "B" es la parte donde los 2 círculos se superponen. "A" es el círculo izquierdo no superpuesto. "C" es el círculo derecho que no se superpone.

c.clipPath(a,Region.Op.REPLACE); 
c.clipPath(b,???); 

Region.Op.DIFFERENCE   -> A..    
Region.Op.INTERSECT   -> .B.    
Region.Op.REPLACE   -> .BC    
Region.Op.REVERSE_DIFFERENCE -> ..C    
Region.Op.UNION    -> ABC 
Region.Op.XOR    -> A.C 

El "." indica la parte que no está dibujada. Lo siento si eso no está particularmente claro. Es difícil describir bien sin gráficos.

Respuesta

18

Desde el Canvasjavadoc:

Canvas#clipPath(Path path, Region.Op op) - Modificar el clip actual con la ruta especificada.

Así que, por su ejemplo de donut:

  1. Crear 2 Caminos. Uno para el círculo más grande, uno para el círculo más pequeño.
  2. Canvas#clipPath(Path) con círculo más grande Path.
  3. Llame al método Canvas#clipPath(Path, Region.Op) en el lienzo con el círculo más pequeño Path para el primer argumento y el valor Region.Op enumeración apropiada para el segundo argumento.

    Path largePath = new Path(); 
    largePath.addCircle(200,200,100,Direction.CW); 
    Path smallPath = new Path(); 
    smallPath.addCircle(200,200,40,Direction.CW); 
    c.clipPath(largePath); // c is a Canvas 
    c.clipPath(smallPath, Region.Op.DIFFERENCE); 
    

Una vez más, modifique el valor Region.Op enumeración para obtener diferentes efectos ...

+0

clipPath no es compatible con Android 4 – Renetik

+2

Clippath se apoya bien, si se desactiva la aceleración de hardware para la vista/actividad /solicitud. La diferencia con Android 4+ es que HA está habilitado por defecto. – Plato

+1

clipPath ahora también es HA en 4.3+ – Ruxton

Cuestiones relacionadas