w3schools property outside masks android drawing android-canvas image-clipping

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);