2010-10-26 12 views

risposta

8

È possibile disegnare dove desiderato, ma nulla verrà salvato al di fuori del rettangolo di ritaglio.

40

Per disegnare all'esterno dei limiti, è necessario espandere il clipRect dell'area di disegno.

Controlla i metodi clipRect in overload sulla classe Canvas.

Nota: è necessario specificare l'operazione Regione perché l'operazione predefinita è INTERSECT. Quindi, qualcosa di simile:

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

Non funziona affatto. Ho appena ridimensionato la tela con i parametri (-2000, -2000), quindi la traduco ma l'immagine che disegno è ancora ritagliata. – tomrozb

+1

ha funzionato per me. +1 – dac2009

+0

ma se lo fai su ogni 'onDraw (canvas canvas)' allora non stai facendo al computer un sacco di lavoro extra? –

28

tenta di impostare

android:clipChildren="false" 

alla vista primaria

+0

Non so della domanda ma voglio ringraziarti per aver risolto, il mio problema, che stavo affrontando. Grazie. Questo è quello che stavo cercando. – tannerjohn

+0

Si prega di dare un'occhiata a http://stackoverflow.com/questions/32735119/draw-outside-the-bounds-of-an-android-canvas –

+0

@MortezaRastgoo la domanda collegata (e le risposte) non tradurre direttamente a questo problema affatto. –

1

La @numan risposta ha dato è quasi ok, il problema è l'allocazione di memoria con questo approccio, così abbiamo dovrebbe fare questo, invece:

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

che risolve il problema :-)

+0

Come inizializzare 'newRect'? –

+1

Ok, immagino il punto qui che newRect viene allocato una volta per init di oggetto, invece di assegnarlo ogni volta che viene chiamato onDraw. –

+0

L'ho provato, ma non ha funzionato. –

0

Se si vuole disegnare il testo fuori dai limiti in TextView, si dovrebbe fare questo, invece:

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

Non funziona utilizzare clipRect() come @ di Numan risposta perché TextView clip di un proprio rect in 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); 

Ultimo ma non meno importante, non dimenticare di impostare android:clipChildren="false" e android:clipToPadding="false" nel vostro genitore ViewGroup

Problemi correlati