2010-10-26 10 views

Respuesta

8

Puede dibujar donde desee, pero no se guardará nada fuera del rectángulo de recorte.

40

Para dibujar fuera de los límites, debe expandir el clipRect del lienzo.

Comprueba los métodos de clipRect sobrecargados en la clase Canvas.

Nota: Deberá especificar la operación Región porque la operación predeterminada es INTERSECCIÓN. Así que algo como esto:

Rect newRect = canvas.getClipBounds(); 
newRect.inset(-5, -5) //make the rect larger 

canvas.clipRect (newRect, Region.Op.REPLACE); 
//happily draw outside the bound now 
+1

No funciona en absoluto. Acabo de cambiar el tamaño del lienzo con los parámetros (-2000, -2000) y luego lo traduzco, pero la imagen que dibujo todavía está recortada. – tomrozb

+1

funcionó para mí. +1 – dac2009

+0

pero si lo haces en cada 'onDraw (Canvas canvas)' ¿no estás haciendo que la computadora haga mucho trabajo extra? –

28

intenta establecer

android:clipChildren="false" 

a la vista padre

+0

No sé sobre la pregunta, pero quiero agradecerle por resolver, mi problema, que estaba enfrentando. Gracias. Esto es lo que estaba buscando. – tannerjohn

+0

Por favor, eche un vistazo a http://stackoverflow.com/questions/32735119/draw-outside-the-bounds-of-an-android- canvas –

+0

@MortezaRastgoo la pregunta (y las respuestas) vinculadas no se traducen directamente a este problema en absoluto. –

1

El @numan respuesta dio es casi bien, el problema es la asignación de memoria con este enfoque, por lo que debería estar haciendo esto, en su lugar:

// in constructor/elsewhere 
Rect newRect = new Rect(); 

// in onDraw 
canvas.getClipBounds(newRect); 
newRect.inset(0, -20); //make the rect larger 
canvas.clipRect(newRect, Region.Op.REPLACE); 

que resuelve el problema :-)

+0

¿Cómo iniciar 'newRect'? –

+1

Bien, supongo que el punto aquí es que newRect se asigna una vez por objeto init, en lugar de asignarlo cada vez que se llama a OnDraw. –

+0

Lo intenté, pero no funcionó. –

0

Si desea dibujar el texto fuera de los límites de Vista de Texto, que debería estar haciendo esto en su lugar:

<TextView 
    ... 
    android:shadowColor="#01000000" 
    android:shadowDx="100" // out of right bound 
    android:shadowDy="0" 
    android:shadowRadius="1" 
.../> 

No está funcionando para usar clipRect() como respuesta @ de Numan porque TextView clip de su propio rect en onDraw():

if (mShadowRadius != 0) { 
    clipLeft += Math.min(0, mShadowDx - mShadowRadius); 
    clipRight += Math.max(0, mShadowDx + mShadowRadius); 

    clipTop += Math.min(0, mShadowDy - mShadowRadius); 
    clipBottom += Math.max(0, mShadowDy + mShadowRadius); 
} 

canvas.clipRect(clipLeft, clipTop, clipRight, clipBottom); 

por último, pero no menos importante, no se olvide de establecer android:clipChildren="false" y android:clipToPadding="false" en su padre ViewGroup

Cuestiones relacionadas