Przesyłam aplikację napisaną w środowisku graficznym, która umożliwia rysowanie poza granicami prostokąta obcinania. Jakikolwiek sposób to zrobić w systemie Android?Czy mogę rysować poza obszarem Androida Canvas
Odpowiedz
Możesz rysować w miejscu, w którym chcesz, ale nic nie zostanie zapisane poza prostokątem obcinania.
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
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
pracował dla mnie. +1 – dac2009
, ale jeśli robisz to na każdym 'onDraw (Canvas canvas)', to czy nie sprawiasz, że komputer wykonuje dużo dodatkowej pracy? –
spróbować ustawić
android:clipChildren="false"
do widoku macierzystego
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
Proszę spojrzeć na http://stackoverflow.com/questions/32735119/draw-outside-the-bounds-of-an-android-canvas –
@MortezaRastgoo połączone pytanie (i odpowiedzi) nie bezpośrednio tłumaczyć na ten problem w ogóle. –
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 :-)
Jak zainicjować 'newRect'? –
OK, domyślam się, że newRect jest przydzielany raz na obiekt init, zamiast przydzielać go za każdym razem, gdy wywoływany jest onDraw. –
Próbowałem, ale to nie zadziałało. –
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
nie mamy pojęcia, co mówisz na przykładzie a niektóre kod – Falmarri