Ich habe eine veröffentlichte App, die beim Start auf Android N abstürzt, wenn die neu eingeführte Display size
Betriebssystemeinstellung auf einen zu großen Wert eingestellt ist.
Wenn ich in logcat nachschaue, wird folgende Meldung angezeigt:
java.lang.RuntimeException: Canvas: trying to draw too large(106,975,232 bytes) bitmap.
Ich habe das Problem in meiner ersten Aktivität auf eine ImageView zurückgeführt, die ein schönes großes Hintergrundbild zeigt. Das betreffende Bild ist 2048 x 1066 und befindet sich in meinem generischen drawables
Verzeichnis. Unabhängig von der Dichte wird dieses Bild verwendet.
Alles funktioniert in Ordnung, wenn die Display size
Einstellung ist Small
. Aber wenn ich nach oben gehe Default
, funktioniert es nicht mehr. Wenn ich dann das Bild gegen ein kleineres austausche, funktioniert es bei Default
, aber wenn ich zu gehe Large
, funktioniert es nicht mehr.
Ich vermute, dass Display size
sich Ihr Gerät beim Anpassen wie ein physisch kleineres Gerät mit einer höheren Pixeldichte verhält. Aber ich verstehe nicht, was ich hier machen soll. Wenn ich immer kleinere Bilder für immer höhere Auflösungen einsetze, sieht es auf wirklich großen Displays nicht gut aus. Oder verstehe ich etwas nicht?
Alle Hinweise wäre sehr dankbar.
quelle
res/drawable/
ist ein Synonym fürres/drawable-mdpi/
. Wenn Sie möchten, dass das Bild nicht basierend auf der Dichte skaliert wird, verwenden Sieres/drawable-nodpi/
oderres/drawable-anydpi/
.res/drawable/foo.png
(auch bekannt alsres/drawable-mdpi/foo.png
) haben und Ihr Gerät istxhdpi
, wird das Bild entlang beider Achsen verdoppelt, was den vierfachen Speicherplatz beansprucht.Antworten:
In meinem Fall war es die Lösung , die ( hochauflösende ) Splash-Bitmap von drawable nach drawable-xxhdpi zu verschieben .
Ich hatte das gleiche Problem. Ich habe nicht mein Begrüßungsbildschirm vermuten , dass das Problem sein, da es wird angezeigt , wenn die Anwendung gestartet wird, aber es stellte sich heraus , das Splash - Screen ist das Problem.
Der Begrüßungsbildschirm hat in meinem Fall eine Auflösung von xxhdpi und wurde fälschlicherweise im Zeichenordner anstelle von drawable-xxhdpi abgelegt . Dies ließ Android davon ausgehen, dass der Begrüßungsbildschirm eine MDPI-Auflösung hatte, und skalierte das Bild auf das 3 * 3-fache der erforderlichen Größe und versuchte, eine Bitmap zu erstellen.
quelle
Ich habe das Problem gelöst, nachdem ich den folgenden Code in das Anwendungs-Tag der Manifest-Datei zwischen android: lines eingefügt habe .
android:hardwareAccelerated="false"
quelle
android:hardwareAccelerated="false"
. zeigt eine seltsame Ansicht in einem Gerät, dessen API-Level unter 22 liegt.Ich weiß nicht, ob es jemandem helfen würde, aber ich lasse es einfach hier. In meinem Fall - Problem war nur auf Sumsung-Geräten mit Android 7, und Problem war in Splash-Screen-Proportionen. nach dem Ändern der Höhe auf 1024 px - alles funktioniert gut
quelle
Verschieben Sie Ihr Bild im Drawable nach mipmap-xxhdpi. Ihr Bild ist im Bitmap-Format, daher sollten Sie Ihr Bild in den Mipmap-Ordner legen, damit es funktioniert
quelle
Versuchen Sie, die Bitmap.Factory-Klasse zu verwenden. Über diesen Link können Sie große Bitmaps effizient laden
quelle
Wenn Sie Picasso verwenden, wechseln Sie wie folgt zu Glide.
Picasso entfernen
Picasso.get().load(Uri.parse("url")).into(imageView)
Glide ändern
Glide.with(context).load("url").into(imageView)
Effizienter
quelle
Es gibt einige Szenarien, in denen Original-Bitmap in ImageViews, Fotobearbeitungs-Apps usw. gezeichnet werden muss.
als oben erwähnte Bucht Einstellung
android:hardwareAccelerated="false"
Verursacht schlechte UI-Erfahrung. Sie können hardwareAccelerated festlegen. Nur eine ausgewählte Aktivität, bei der hochauflösende Bilder gezeichnet werden sollen
<application android:hardwareAccelerated="true"> <activity ... /> <activity android:hardwareAccelerated="false" /> </application>
quelle
Ich habe den Logcat überprüft
Prozess: co.coolresume, PID: 11145 java.lang.RuntimeException: Canvas: Es wird versucht, eine zu große Bitmap (572166144 Byte) zu zeichnen. at android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:229) at android.view.RecordingCanvas.drawBitmap (RecordingCanvas.java:97) at android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable) widget.ImageView.onDraw (ImageView.java:1367) unter android.view.View.draw (View.java:19380)
Ich habe den Fehler mit dem nächsten Manifest behoben
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" android:hardwareAccelerated="false"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
quelle
Die Symboldateien sind zu groß, als dass Android sie effizient und reibungslos laden könnte. Android erkennt dies an seinen intelligenten Algorithmen.
Sie können die Größe der Symboldateien mit Final Android Resizer ändern von asystat ändern. Ändern Sie die Größe auf "xhdpi" oder niedriger.
Platzieren Sie die Fotos in der Größe in Zeichenform oder überschreiben Sie sie über den vorhandenen großen Symboldateien.
Dann bist du fertig.
quelle
Wenn Sie Gleiten verwenden und jeweils 1k Bilder oder einige Bilder laden, liegt ein Problem mit Gleiten vor oder was auch immer Sie tun, um die Bildansicht festzulegen. Sie können es einfach beheben, indem Sie den Skalentyp in gleiten anwenden.
quelle
In meinem Fall habe ich gerade die Leinwand des Bildes geändert, das im Hintergrund mit Paint3d verwendet wird (oder Sie können jedes andere verwenden). Hier teile ich einen Screenshot, gehe ihn einfach durch.
quelle
Dies wird gelöst, indem die Größe der Bilder auf eine niedrigere Größe geändert wird.
quelle