2011-02-14 18 views
5

Quiero rellenar el área fuera de un rectángulo en un lienzo. Yo usoLienzo de relleno fuera del rectángulo

canvas.drawRect(pTopLeft.x, pTopLeft.y, pBotRight.x, pBotRight.y, paint); 

para dibujar el rectángulo, pero no puedo encontrar la manera de llenar fuera del rectángulo/clip.

Gracias Geoff

Respuesta

6

Usted no se va a llenar fuera de la pinza; ese es el tipo de cosa que hay para prevenir! Si desea llenar el espacio exterior y en el interior de un rect los límites de la capa de dibujo, la construcción de cuatro rectas auxiliares:

Rect above = new Rect(0, 0, canvas.getWidth(), pTopLeft.y); 
Rect left = new Rect(0, pTopLeft.y, pTopLeft.x, pBotRight.y); 
Rect right = new Rect(pBotRight.x, pTopLeft.y, canvas.getWidth(), pBotRight.y); 
Rect bottom = new Rect(0, pBotRight.y, canvas.getWidth(), canvas.getHeight()); 

Luego llene estos.

+0

Gracias Ted. Jugué alrededor llenando todo el lienzo y luego tratando de hacer que la región del clip fuera transparente, nada bueno. Tu método hizo el truco. – Geoff

+3

Sé que lo tiene funcionando ahora, pero se me ocurrió otra posibilidad: establecer una región de clip que excluya el medio y el relleno. Creo que si usas 'canvas.clipRect (innerRect, Region.Op.DIFFERENCE)' perforará el agujero que quieras. –

+0

@TedHopp En realidad no puedo obtener ningún rectángulo. ¿Puedes compartir conmigo cómo dibujar un rectángulo y rellenar un rectángulo fuera de los límites? – ImMathan

0

No puede dibujar fuera del Canvas; esa área pertenece al padre View. ¿Tiene la posibilidad de subclasificar al padre View y hacer su dibujo en esa clase?

Si desea dibujar fuera de la pinza Canvas entonces tendrá que invalidate() las áreas que le interesan

15

Gracias Ted y trojanfoe -. La solución más elegante que he llegado con es

Point pTopLeft = new Point(); 
    Point pBotRight = new Point(); 

    //TODO:set x,y for points 

    Rect rHole = new Rect(pTopLeft.x, pTopLeft.y, pBotRight.x, pBotRight.y); 
    //assume current clip is full canvas 
    //put a hole in the current clip 
    canvas.clipRect(rHole, Region.Op.DIFFERENCE); 
    //fill with semi-transparent red 
    canvas.drawARGB(50, 255, 0, 0); 
    //restore full canvas clip for any subsequent operations 
    canvas.clipRect(new Rect(0, 0, canvas.getWidth(), canvas.getHeight()) 
        , Region.Op.REPLACE); 
+1

¿me puede decir qué puntos debe asignar para dibujar un centro de rectángulo y rellenarlo fuera de los límites? – ImMathan

+1

esta debería ser la respuesta aceptada. –

1

ICS y por encima de ...

canvas.clipRect(rHole, Region.Op.DIFFERENCE); 

XOR, Diferencia y ReverseDifference los modos de clip son ignorados por ICS si la aceleración de hardware está habilitada.

Sólo desactivar la aceleración de hardware 2D en su opinión:

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

Referencia Android: Howto use clipRect in API15

Cuestiones relacionadas