2013-03-13 15 views
5

Czy istnieje sposób zapobiegania rysowaniu części obiektów, takich jak bitmapy lub ścieżki, które wykraczają poza granice Canvas w SurfaceView?Zapobieganie rysowaniu poza obszarem płótna z SurfaceView

Kiedy stopniowo przeskalam obiekt poza rozmiar Canvas ', szczególnie w przypadku rozmytej farby, wszystko spowalnia do stanu zatrzymania i muszę poczekać kilka sekund, aby odzyskać kontrolę - nie reaguje. Przeskalowuję obiekt przesuwając palcem po ekranie; jeśli robię to zbyt szybko i skaluję, to naprawdę spowalnia rysowanie.

Nie miałem tego samego problemu, gdy używam zwykłego płótna View, więc nie wiem, co go spowalnia. To tak, jakby SurfaceView zareagował zbyt szybko, a następnie został przeciążony.

Jednym z pomysłów na poprawienie tego jest uniemożliwienie rysowania poza obszarem płótna, ale nie jest pewne, czy SurfaceView ma takie opcje obcinania.

Odpowiedz

1

Rozwiązaniem może to przy użyciu jednego z Canvas.drawBitmap metod akceptowanych do źródła Rect/RectF argumentu, tak, że jedynie widoczną część Bitmap staje się. Właśnie zrobiłem to na moim własnym projekcie, aby przyśpieszyć wydajność SurfaceView, gdzie mam kilka Bitmaps, które są czasami tylko częściowo widoczne.

+0

Tak, mogę użyć tego w bitmapach, ale w tej chwili rysuje ścieżkę większą niż płótno, które stanowi problem. – Lumis

0

Kiedy można umieścić SurfaceView na układ swojej działalności, można użyć padding atrybuty jak:

android:paddingLeft="20dp" 
android:paddingTop="20dp" 
android:paddingRight="20dp" 
android:paddingBottom="20dp" 

To działa tak:

Padding depiction

zwrócić płótno ty można rysować dinamicznie granice za pomocą:

canvas.drawLine(1,1,canvas.getWidth()-1,1); //Top border 
canvas.drawLine(1,1,1,canvas.getHeight()-1); //Left border 
canvas.drawLine(1,canvas.getHeight()-1,canvas.getWidth()-1,canvas.getHeight()-1); //Bottom border 
canvas.drawLine(canvas.getWidth()-1,1,canvas.getWidth()-1,canvas.getHeight()-1); //Right border 
1

Nie jestem pewien, czy płótno faktycznie rysowałoby rzeczy poza wymiarami, co nie byłoby mądrym posunięciem. Mimo to można użyć clipRect(), aby zdefiniować region klipu.

Czy stosujesz filtry, takie jak rozmycie w ramce? to może być dość drogie.

Czy wywołujesz także wywołania losowe w wydarzeniu dotykowym? Zdarzenia dotykowe są generowane bardzo szybko i zalewają wątek renderowania. Możesz chcieć odbierać zdarzenia z mniejszą szybkością: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/Oe6k1_bm38o

+0

Tak, rozmycie bardzo spowalnia, szczególnie, gdy kształt ścieżki jest większy niż ekran. Funkcja clipRect() nie działa. Próbowałem oznaczyć żebranie i koniec funkcji onDraw(), aby pomijać zdarzenia dotykowe, ale nie pomagało; jak rysunek został przekazany sprzętowi i to tam zwalnia. – Lumis