En Android, ¿cómo hago extrañas áreas de recorte?
Aquí es cómo crear un área de recorte 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 impide dibujar algo fuera de los límites de ese círculo. Pero, ¿qué pasa si quiero tener el área de recorte en forma de donut (o lo que sea)?
- ¿Cuál es la diferencia de invoke-virtual e invoke-direct en android
- Tamaño máximo del caché duro de un ImageDownloader
- ¿Cómo integrar Scala en la plataforma Android principal?
- ¿Cuál es la diferencia entre Dalvik VM y ART Runtime?
- Eclipse, Android: Inesperado No se puede ejecutar dex: se definen varios archivos dex
Intenté jugar alrededor con crear una segunda trayectoria y usar toggleInverseFillType en él y después agregar eso a la trayectoria original, pero eso no parece trabajar.
Alternativamente, en vez de usar un Path, ¿es posible crear un Bitmap para usar como una máscara y configurarlo como una máscara de recorte en el Canvas de alguna manera?
EDIT: La respuesta es exactamente lo que necesitaba con una pequeña adición. Cuando realice varias operaciones en un lienzo, utilice siempre Op.REPLACE en la primera llamada a clipPath. Esto reemplazará cualquier clipPath existente en ese lienzo.
Para referencia, aquí es lo que descubrí lo que significan los 6 valores Region.Op diferentes. 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 que no se superpone. "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 -> AC
Los "." Indica la parte que no está dibujada. Lo siento si eso no es particularmente claro. Es difícil describir bien sin gráficos.
- Android java apoyo lambda expresión en java 8?
- Se ha producido un error en la conversión al formato Dalvik: No se puede ejecutar dex: Se sobrepasó el límite superior de GC
- Entendiendo Android: Zygote y DalvikVM
- Android dalvik recogida de basura puede bloquearse?
- ¿Cuál es la diferencia entre DVM y ART? ¿Por qué DVM ha sido oficialmente reemplazado por ART en Lollipop?
- Cómo minimizar las ocurrencias GC_FOR_ALLOC?
- Java.lang.IllegalArgumentException: Rect debe intersectarse con los límites del niño
- Transformación automática del código dex de Android
De la Canvas
javadoc :
Canvas#clipPath(Path path, Region.Op op)
– Modifica el clip actual con la ruta especificada.
Por lo tanto, para su ejemplo donut:
- Crear 2 rutas. Uno para el círculo más grande, uno para el círculo más pequeño.
-
Canvas#clipPath( Path )
con mayorPath
círculo. -
Llame al
Canvas#clipPath( Path, Region.Op )
en su lienzo con el círculo más pequeñoPath
para el primer argumento y el valor de enumRegion.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);
Una vez más, modifique el valor de enum Region.Op
para obtener diferentes efectos …
- ¿Cuál es la diferencia entre un hilo y un manejador
- Error: Error de ejecución para la tarea ': app: fabricGenerateResourcesDebug'. > Error de Crashlytics Developer Tools