android - property - css masks
Canvas.clipPath(ruta) no se recorta como se esperaba (2)
¿Está utilizando HC o superior o de otro modo está utilizando la aceleración de hardware?
Si es así, clipPath no es compatible y problemático.
developer.android.com/guide/topics/graphics/hardware-accel.html .
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 establecer el trazado de recorte en el lienzo.
Para ilustrar, esto es lo que estoy haciendo:
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 configuro este camino como 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);
En cambio, obtengo el siguiente resultado (la cuña se deja solo para mostrar la referencia):
Entonces, en cambio, parece que se engancha al límite del Path
, y no al Path
sí. ¿Alguna idea de lo que está pasando aquí?
EDITAR Solo como una actualización, he encontrado una forma mucho más eficiente de hacer esto que permite la aceleración de hardware. Primero, dibuje la imagen completa (que estaría recortando) en un mapa de bits fuera de la pantalla. Haga un BitmapShader
usando este Bitmap
, establezca ese sombreado en un Paint
, luego dibuje la ruta de cuña usando ese objeto 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
);
}
La pregunta de OP es específicamente sobre el uso de una región de recorte y ha sido respondida por @Simon. Sin embargo, tenga en cuenta que hay una forma 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 dibuja el camino:
canvas.drawPath(path, mPaint);