una redondas recortar para online imagen gratis fotos como circulo celular app android android-canvas dalvik masking

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:

  1. Crea 2 caminos. Uno para el círculo más grande, uno para el círculo más pequeño.
  2. Canvas#clipPath( Path ) con un círculo más grande Path .
  3. Llame al Canvas#clipPath( Path, Region.Op ) en su canvas con la Path círculo más pequeño para el primer argumento y el valor de enumeración Region.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 ...