2015-03-07 7 views
7

Zastanawiam się, czy istnieje sposób rysowania wypełnionych obszarów (takich jak wypełniony wielokąt) za pomocą Canvas Android bez użycia klasy klasy Path i zadzwoń pod numer canvas.drawPath(...).Czy istnieje sposób na narysowanie wypełnionego obszaru Canvas bez użycia ścieżki?

Powodem, dla którego chcę to zrobić bez Path jest to, że muszę narysować bardzo duże zbiory danych i canvas.drawPath(...) nie jest przyspieszany sprzętowo, a zatem wolny.

Wydajność przy korzystaniu z canvas.drawLines(...) jest znacznie lepsza ze względu na przyspieszenie sprzętowe, jednak nie znalazłem sposobu na wypełnienie wielokąta za pomocą tego podejścia (nawet jeśli wszystkie linie są połączone).

Nawet wywołanie paint.setStyle(Style.FILL) nie wypełniło wielokąta podczas korzystania z drawLines(...).

Czy istnieje sposób narysowania wypełnionego wielokąta bez stosowania podejścia Path?

Lub Czy jest jakiś inny sposób, aby poprawić wydajność przy użyciu przy użyciu Canvas?

+0

Czy Twój widok "widok" jest interaktywny (czy w twoim zestawie danych są potrzebne zmiany, które należy wyrenderować)? Po prostu wyciągając swój zestaw danych do "płótna", który jest wolny? –

+0

Mój widok jest interaktywny i dlatego stale odświeżany, używam już mechanizmu buforowania, który znacznie poprawił wydajność. Jednak nie jestem jeszcze usatysfakcjonowany. –

+0

Moje ostatnie pytanie do opracowania odpowiedzi. Kiedy pojawia się zmiana w zestawie danych, czy ponownie rysujesz cały zestaw danych, czy tylko te, których dotyczy zmiana? Mam na myśli, czy już używasz 'view.invalidate (Rect dirty)'? To tylko wskazówka, aby poprawić wydajność. –

Odpowiedz

0

Możesz chcieć spojrzeć na widok OpenGL i użyć go do wszystkich potrzebnych rysunków. Na pewno będzie cholernie szybko. Mimo to cały kod rysunkowy musi zostać ponownie napisany.

+3

Naprawdę nie odpowiada na pytanie, które zadaje konkretnie rozwiązanie za pomocą "Canvas". –

+1

Tak, zdaję sobie sprawę, że OpenGL ES jest szybszy. Jednak nie jest to opcja dla mnie. –

0

Prawdopodobnie trzeba zrobić coś takiego:

Paint red = new Paint(); 

red.setColor(android.graphics.Color.RED); 
red.setStyle(Paint.Style.FILL); 

i wykorzystać tę barwę na swojej drodze, zamiast swojego aRGB. Upewnij się, że ostatni punkt twojej ścieżki kończy się na pierwszym, ma to również sens.

Powiązane problemy