android - redondas - recortar imagen circular online
En Android, ¿cómo hago áreas de recorte de formas extrañas? (1)
Aquí es cómo crear un área de recorte con la forma de un círculo:
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 que evita dibujar nada fuera de los límites de ese círculo. Pero, ¿qué pasa si quiero que el área de recorte tenga la forma de una dona (o lo que sea)?
Intenté jugar con la creación de una segunda ruta y usar toggleInverseFillType en ella y luego agregarla a la ruta original, pero eso no parece funcionar.
Alternativamente, en lugar de usar una ruta, ¿es posible simplemente crear un mapa de bits para usarlo como máscara y configurarlo como máscara de recorte en el lienzo de alguna manera?
EDITAR: La respuesta es exactamente lo que necesitaba con una pequeña adición. Cuando realice múltiples operaciones en un lienzo, siempre use Op.REPLACE en la primera llamada clipPath. Eso reemplazará cualquier clipPath existente en ese lienzo.
Para referencia, aquí es lo que descubrí lo que significan los 6 valores diferentes de Region.Op. Imagina un diagrama de venn con 2 círculos. "B" es la parte donde se superponen los 2 círculos. "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
Los "." Indica la parte que no está dibujada. Lo siento si eso no es particularmente claro. Es difícil de describir bien sin gráficos.
Desde el Canvas
javadoc :
Canvas#clipPath(Path path, Region.Op op)
- Modifica el clip actual con la ruta especificada.
Por lo tanto, para su ejemplo de rosquilla:
- Crea 2 caminos. Uno para el círculo más grande, uno para el círculo más pequeño.
-
Canvas#clipPath( Path )
con un círculo más grandePath
. Llame al
Canvas#clipPath( Path, Region.Op )
en su canvas con laPath
círculo más pequeño para el primer argumento y el valor de enumeraciónRegion.Op
apropiado 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);
De nuevo, modifique el valor de enumeración de Region.Op
para obtener diferentes efectos ...