Mam opublikowaną aplikację, która ulega awarii podczas uruchamiania systemu Android N, gdy nowo wprowadzone Display size
ustawienie systemu operacyjnego ma zbyt dużą wartość.
Kiedy patrzę w logcat, widzę następujący komunikat:
java.lang.RuntimeException: Canvas: trying to draw too large(106,975,232 bytes) bitmap.
W mojej pierwszej aktywności prześledziłem problem do ImageView, który pokazuje ładny, duży obraz tła. Obraz, o którym mowa, ma rozmiar 2048x1066 i znajduje się w moim drawables
katalogu ogólnym , więc bez względu na gęstość będzie używany.
Wszystko działa dobrze, gdy Display size
jest to ustawienie Small
. Ale kiedy podchodzę Default
, przestaje działać. Jeśli następnie zamienię obraz na mniejszy, działa Default
, ale jeśli podejdę do Large
, przestaje działać.
Domyślam się, że dostosowanie w Display size
górę powoduje, że Twoje urządzenie zachowuje się jak fizycznie mniejsze urządzenie z większą gęstością pikseli. Ale nie rozumiem, co mam tutaj zrobić. Jeśli wstawię stopniowo mniejsze obrazy dla coraz wyższych rozdzielczości, nie będzie to dobrze wyglądać na faktycznie dużych wyświetlaczach. A może czegoś nie rozumiem?
Wszelkie wskazówki byłyby bardzo mile widziane.
źródło
res/drawable/
to synonimres/drawable-mdpi/
. Jeśli chcesz, aby obraz nie był skalowany na podstawie gęstości, użyjres/drawable-nodpi/
lubres/drawable-anydpi/
.res/drawable/foo.png
(aka,res/drawable-mdpi/foo.png
), a twoje urządzenie jestxhdpi
, obraz zostanie podwojony wzdłuż obu osi, zajmując 4x pamięć.Odpowiedzi:
W moim przypadku rozwiązaniem było przeniesienie (hi-res) splash bitmap z drawable do drawable-xxhdpi .
Miałem ten sam problem. Nie podejrzewałem, że problem stanowi mój ekran powitalny, ponieważ jest on wyświetlany po uruchomieniu aplikacji, ale okazało się, że problem stanowi ekran powitalny.
Ekran powitalny w moim przypadku ma rozdzielczość xxhdpi i został omyłkowo umieszczony w folderze do rysowania , zamiast do drawable-xxhdpi . To sprawiło, że Android założył, że ekran powitalny ma rozdzielczość mdpi i skaluje obraz do 3 * 3 razy większy od wymaganego rozmiaru i próbuje utworzyć bitmapę.
źródło
Rozwiązałem problem po dodaniu poniższego kodu do tagu aplikacji pliku Manifest pomiędzy liniami android :.
android:hardwareAccelerated="false"
źródło
android:hardwareAccelerated="false"
. pokazujący dziwny widok na jakimś urządzeniu, które ma poziom API poniżej 22.Nie wiem, czy to komuś pomogło, ale zostawię to tutaj. W moim przypadku - problem występował tylko na urządzeniach Sumsung z Androidem 7, a problem był w proporcjach ekranu powitalnego. po zmianie wysokości na 1024 px - wszystko działa dobrze
źródło
Przenieś obraz w formacie do rysowania do mipmap-xxhdpi.Twój obraz jest w formacie bitmapy, więc powinieneś umieścić go w folderze mipmap, wtedy zadziała
źródło
Spróbuj użyć klasy Bitmap.Factory, to łącze pomoże Ci efektywnie ładować duże mapy bitowe
źródło
jeśli używasz Picassa, zmień na Glide w ten sposób.
Usuń Picasso
Picasso.get().load(Uri.parse("url")).into(imageView)
Zmień Glide
Glide.with(context).load("url").into(imageView)
Bardziej wydajny
źródło
Istnieje kilka scenariuszy, w których oryginalna bitmapa musi zostać narysowana w ImageViews, aplikacjach do edycji zdjęć itp.,
Jak wspomniano powyżej ustawienie zatoki
android:hardwareAccelerated="false"
Spowoduje złe doświadczenia z interfejsem użytkownika, możesz ustawić przyspieszenie sprzętowe Tylko jedno wybrane działanie, w którym ma być narysowany obraz w wysokiej rozdzielczości
<application android:hardwareAccelerated="true"> <activity ... /> <activity android:hardwareAccelerated="false" /> </application>
źródło
Pliki ikon są zbyt duże, aby system Android mógł je wydajnie i płynnie załadować. Android rozpoznaje to dzięki swoim inteligentnym algorytmom.
Możesz zmienić rozmiar plików ikon za pomocą Final Android Resizer przez asystat. Zmień ich rozmiar na „xhdpi” lub niższy.
Umieść zdjęcia o zmienionym rozmiarze do rysowania lub nadpisz na istniejących dużych plikach ikon.
Następnie gotowe.
źródło
jeśli używasz Glide i ładujesz 1k obrazów na raz lub kilka obrazów, to jest to kwestia poślizgu lub czegokolwiek, co robisz, aby ustawić widok obrazu. można go rozwiązać po prostu stosując typ skali w poślizgu.
źródło
W moim przypadku właśnie zmieniłem płótno obrazu, które jest używane w tle za pomocą Paint3d (lub możesz użyć dowolnego innego). Tutaj udostępniam zrzut ekranu, po prostu go przejrzyj.
źródło
rozwiązuje się go, zmniejszając rozmiar obrazów.
źródło