Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Comportamiento diferente para FillType.EVEN_ODD al agregar un CornerPathEffect?

Estaba experimentando con Drawable aquí y encontré algo que no puedo explicar y espero que alguien me pueda ayudar.

¿Por qué la adición de un CornerPathEffect a la Paint parece "romper" (?) El EVEN_ODD FillType ?

Para ser más específico, estaba probando esta clase HexagonDrawable como es. Esto es lo que obtengo:

Esquinas duras, perfilado, comportamiento esperado.

Sin embargo, si establezco un CornerPathEffect a la Paint , como se muestra a continuación (constructor) …

 public HexagonDrawable(int color) { paint.setColor(color); paint.setPathEffect(new CornerPathEffect(6)); // added hexagon.setFillType(Path.FillType.EVEN_ODD); } 

… esto es lo que obtengo:

Esquinas redondeadas, efecto de contorno desaparece, comportamiento inesperado?

Esquinas redondeadas, sí, pero sin apariencia esbozada (impar / par / impar). ¿Podría alguien por favor explicar por qué?

  • Cómo crear este tipo de pincel para pintar en android
  • Canvas 'drawLine y drawRect no incluye la posición final?
  • Detección de la posición inicial y final de un 'arrastre' en Android y dibujo de una línea entre ellos
  • Dibujo sobre lienzo y varios objetos de pintura
  • Cómo convertir rgb color a int en java
  • La capa de sombra funciona con el emulador pero no en un dispositivo real
  • Android: firma digital con Bezier
  • Android - Cómo dibujar en vista
  • One Solution collect form web for “¿Comportamiento diferente para FillType.EVEN_ODD al agregar un CornerPathEffect?”

    Esa clase HexagonDrawable dibuja dos hexágonos diferentes, apilados uno encima del otro. No sé si necesitas que sea así, pero creo que la mejor manera de lograr el mismo resultado es usar un estilo Paint with Stroke.

    Para ello, debe quitar la segunda trayectoria hexagonal y disminuir el tamaño del hexágono (para que la vista no lo corte):

     public void computeHex(Rect bounds) { final int width = bounds.width(); final int height = bounds.height(); // We need to decrease the hexagon's size, so the view won't cut our stroke final int size = Math.min(width - (strokeWidth / 2), height - (strokeWidth / 2)); final int centerX = bounds.left + (width / 2); final int centerY = bounds.top + (height / 2); hexagon.reset(); hexagon.addPath(createHexagon(size, centerX, centerY)); // Remove the second path // hexagon.addPath(createHexagon((int) (size * .8f), centerX, centerY)); } 

    Y agrega el efecto Stroke a la pintura:

     private int strokeWidth; public HexagonDrawable(int color, int strokeWidth) { this.strokeWidth = strokeWidth; paint.setColor(color); // Add Stroke style and width paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(strokeWidth); // You can add these other attributes if you need to // paint.setDither(true); // paint.setStrokeJoin(Paint.Join.ROUND); // paint.setStrokeCap(Paint.Cap.ROUND); // Remove the fill type, you won't need anymore // hexagon.setFillType(Path.FillType.EVEN_ODD); // Finally add the Path Effect paint.setPathEffect(new CornerPathEffect(30.0f)); } 

    Eso debería crear un efecto muy similar a lo que estaba buscando.

    ¡Espero eso ayude! 😉

    Edit: He olvidado advertirle que el ancho de trazo no puede ser mayor que el radio de CornerPathEffect, de lo contrario se cortará de todos modos.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.