2010-10-26 11 views

Odpowiedz

8

Możesz rysować w miejscu, w którym chcesz, ale nic nie zostanie zapisane poza prostokątem obcinania.

40

Aby rysować poza obrębem, musisz rozwinąć element clipRect obszaru roboczego.

Sprawdź przeciążone metody clipRect w klasie Canvas.

Uwaga - Musisz określić operację Region, ponieważ domyślną operacją jest INTERSECT. Więc coś takiego:

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

To nie działa w ogóle. Zmieniam rozmiar płótna z parametrami (-2000, -2000), a następnie go przetłumaczyć, ale obraz, który rysuję, jest nadal obcięty. – tomrozb

+1

pracował dla mnie. +1 – dac2009

+0

, ale jeśli robisz to na każdym 'onDraw (Canvas canvas)', to czy nie sprawiasz, że komputer wykonuje dużo dodatkowej pracy? –

28

spróbować ustawić

android:clipChildren="false" 

do widoku macierzystego

+0

Nie wiem o tym pytaniu, ale chcę ci podziękować za rozwiązanie, mój problem, z którym miałem do czynienia. Dziękuję Ci. Tego właśnie szukałem. – tannerjohn

+0

Proszę spojrzeć na http://stackoverflow.com/questions/32735119/draw-outside-the-bounds-of-an-android-canvas –

+0

@MortezaRastgoo połączone pytanie (i odpowiedzi) nie bezpośrednio tłumaczyć na ten problem w ogóle. –

1

Odpowiedź @numan dał prawie ok, problem jest alokacja pamięci z tym podejściem, więc należy to zrobić, zamiast:

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

który rozwiązuje ten problem :-)

+0

Jak zainicjować 'newRect'? –

+1

OK, domyślam się, że newRect jest przydzielany raz na obiekt init, zamiast przydzielać go za każdym razem, gdy wywoływany jest onDraw. –

+0

Próbowałem, ale to nie zadziałało. –

0

Jeśli chcesz narysować tekst poza granicami w TextView, należy robić to zamiast:

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

To nie działa w użyciu clipRect() jak na @ Numan odpowiedź bo TextView clip własną rect w 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); 

Last but not least, nie zapomnij, aby ustawić android:clipChildren="false" i android:clipToPadding="false" w rodzica ViewGroup

Powiązane problemy