2013-05-02 31 views
5

Pracuję nad niestandardowym widokiem wykresu w systemie Android, który korzysta z funkcji Canvas # drawLines i obiektu paint z włączonym wygładzaniem antyaliasingu. Mój widok ma włączoną akcelerację sprzętową. Od czasu do czasu, gdy przybliżam/oddalam powiększanie, niektóre linie na moim wykresie będą wyglądały na rozłączone i będą się zbierać w gradiencie. Jeśli zmienię warstwę oprogramowania lub wyłączyłem wygładzanie, problem zniknie. Czy jest to błąd związany z drawLines, czy ktoś ma pojęcie o tym, co może się dziać?Android - rysowanie z akceleracją sprzętową i antyaliasingiem powoduje powstawanie artefaktów

Pierwszy obraz przedstawia problem, drugi obraz został nieznacznie przesunięty i pokazuje, jak wykres wygląda przez większość czasu, z całkowicie połączonymi liniami.

(obraz pokazuje problem) enter image description here

(obraz pokazujący jak wykres powinien wyglądać - jeszcze kilka drobnych luk) enter image description here

Odpowiedz

1

myślę, że ten post przez Romain Guy odpowiedzi na niektóre pytanie: http://android-developers.blogspot.com/2011/03/android-30-hardware-acceleration.html

Zasadniczo anty-aliasing nie jest obsługiwany przez linie wyciągania, gdy akceleracja sprzętowa jest włączona. Pamiętaj też, że przyspieszenie sprzętowe nie zawsze będzie "lepsze" dla Twojej aplikacji. Jeśli to, co rysujesz, może zostać przyspieszone, aplikacja skorzysta na tym, ale w przypadku niektórych operacji może być gorsza.

Wydaje mi się, że to wyjaśnia, dlaczego linie pojawiają się rozłącznie podczas przyspieszania sprzętowego. Nie jestem pewien, czy wyjaśnia, dlaczego działa po wyłączeniu anty-aliasingu. Wyobrażam sobie, że wygląda na rozłączony nawet przy wygaszaniu antyaliasingu, ale oczywiście tak nie jest!

+0

Dzięki. Zetknąłem się z podobnym problemem. Próbowałem rozwiązać, używając 'LAYER_TYPE_SOFTWARE'. Jednak wydaje się, że wolniej, jak na wykresie, jest ruchome skrzyżowanie, w oparciu o moje zdarzenie dotykowe. Wiesz dlaczego? Domyślam się, że czas jest zajęty przeniesieniem programowej bitmapy poza grafiką, na GPU, kiedy używane jest 'LAYER_TYPE_SOFTWARE'. –

+0

Po wyłączeniu funkcji anti-alias, chociaż rozłączny problem już nie występuje, narysowana linia nie jest gładka i wygląda brzydko. –

1

Spróbuj wymusić odświeżenie po gestach zmiany rozmiaru.

Spójrz na moją starą aplikację Accelerometer Toy. (Tak, to NAPRAWDĘ potrzebuję aktualizacji ...) Jeśli nie widzisz problemu z tą aplikacją, to prawdopodobnie pomogę.