Canvas.clipPath (ruta) no recorte como se esperaba
Estoy tratando de cortar una operación de dibujo de lienzo a una cuña en forma de arco. Sin embargo, no obtengo el resultado deseado después de configurar el trazado de recorte del lienzo.
Por ejemplo, esto es lo que estoy haciendo:
- ¿Cómo dibujo una línea blanca semitransparente?
- Cómo borrar el dibujo anterior en lienzo?
- Android: ¿Cómo overlay-a-bitmap / draw-over un mapa de bits?
- ¿Cómo dibujar una línea entre puntos y tirar de esos puntos?
- Canvas 'drawLine y drawRect no incluye la posición final?
path.reset(); //Move to point #1 path.moveTo(rect.centerX(), rect.centerY()); //Per the documentation, this will draw a connecting line from the current //position to the starting position of the arc (at 0 degrees), add the arc //and my current position now lies at #2. path.arcTo(rect, 0, -30); //This should then close the path, finishing back at the center point (#3) path.close();
Esto funciona, y cuando simplemente dibujo este camino ( canvas.drawPath(path, paint)
) dibuja la cuña como se muestra arriba. Sin embargo, cuando establezco este camino como el trazado de recorte del lienzo y dibujo en él:
//I've tried it with and without the Region.Op parameter canvas.clipPath(path, Region.Op.REPLACE); canvas.drawColor(Color.BLUE);
Consigo el resultado siguiente en lugar de otro (la cuña se deja apenas para demostrar la referencia):
Por lo tanto, en su lugar, parece que se clava en el rectángulo del Path
, y no en el Path
. ¿Alguna idea de lo que está sucediendo aquí?
EDIT Como una actualización, he encontrado una manera mucho más eficiente de hacer esto que permite la aceleración de hardware. Primero, dibuja la imagen completa (que estarías recortando) en un mapa de bits sin pantalla. Hacer un BitmapShader
utilizando este Bitmap
, establecer ese sombreado en una Paint
, a continuación, dibujar la ruta de cuña con ese objeto de Paint
:
drawMyBitmap(bitmap); Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setShader(shader); @Override public void onDraw(Canvas canvas) { canvas.drawArc(rect, //The rectangle bounding the circle startAngle, //The angle (CW from 3 o'clock) to start sweepAngle, //The angle (CW from 3 o'clock) of the arc true, //Boolean of whether to draw a filled arc (wedge) paint //The paint with the shader attached ); }
- Cómo dibujar una ruta con ancho de trazo variable
- Cómo actualizar el texto de dibujo de lienzo en lugar de volver a dibujar el lienzo
- ¿Cómo animar la posición de desplazamiento? ¿Cómo desplazarse sin problemas?
- Android - Dibujo de una imagen de los activos, algo raro está sucediendo
- Personalizar una ProgressBar para convertirse en un termómetro
- Comportamiento extraño al dibujar un anillo usando Path.arcTo () en Android
- Coordenadas no correspondientes
- Canvas.drawLines mostrando segmentos disjuntos
¿Está utilizando HC o superior o de otro modo utilizando la aceleración de hardware?
Si es así, clipPath no es compatible y es problemático.
Developer.android.com/guide/topics/graphics/hardware-accel.html .
La pregunta del OP es específicamente sobre el uso de una región de recorte y ha sido contestada por @Simon. Tenga en cuenta, sin embargo, que hay una manera más sencilla de dibujar un arco lleno:
Crear una Paint
:
mPaint = new Paint(); mPaint.setColor(Color.BLUE); mPaint.setStyle(Style.FILL); mPaint.setAntiAlias(true);
Al dibujar, simplemente dibuje el camino:
canvas.drawPath(path, mPaint);
- Android Studio gradle – ### – bin.zip vs gradle – ### – todos.zip
- Android Expandible RecyclerView diferente Altura de la tarjeta