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:

Introduzca aquí la descripción de la imagen

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

Introduzca aquí la descripción de la imagen

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

¿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); 
  • Dibujo con los dedos
  • ¿Cómo configurar la validación en canvas android?
  • El elemento ActionBar no se muestra cuando un ShapeDrawable está configurado como su icono
  • Android dibuja texto en rectángulo en el centro y recórtalo si es necesario
  • Trayecto de bola de dibujo de Android
  • No se puede dibujar en un lienzo HTML5 con Phonegap 2.7
  • Cómo dibujar línea en imageview junto con dedo en android
  • Cómo dibujar figuras sin llenar en Android?
  • Cómo asignar coordenadas de marco a superposición en la visión
  • Dibujar en un lienzo con demora - "hacer onDraw () reducir la velocidad"
  • Lanzar una lona de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.