Android Nの表示サイズが小さいより大きく設定されている場合の「キャンバス:大きすぎるビットマップを描画しようとしています」


83

新しく導入されたDisplay sizeOS設定の値が大きすぎると、AndroidNの起動時にクラッシュする公開アプリがあります。

logcatを見ると、次のメッセージが表示されます。

java.lang.RuntimeException: Canvas: trying to draw too large(106,975,232 bytes) bitmap.

最初のアクティビティで、大きな背景画像を表示するIm​​ageViewに問題を追跡しました。問題の画像は2048x1066で、私の汎用drawablesディレクトリにあるため、密度に関係なく、この画像が使用されます。

Display size設定がである場合、すべてが正常に機能しますSmall。しかし、私がに上がるとDefault、それは動作を停止します。次に、画像を小さい画像と交換すると、で動作しますDefaultが、に上がるとLarge、再び動作を停止します。

私の推測では、調整Display sizeすると、デバイスは物理的に小さいデバイスのように動作し、ピクセル密度が高くなります。しかし、私はここで何をすべきか理解していません。徐々に小さい画像を入れて徐々に高い解像度にすると、実際には大きなディスプレイでは見栄えが悪くなります。それとも私は何かを理解していませんか?

どんなポインタでも大歓迎です。


25
「問題の画像は2048x1066で、私の一般的なドローアブルディレクトリにあるので、密度に関係なく、この画像が使用されます」-はのres/drawable/同義語ですres/drawable-mdpi/。濃度に基づいて画像が拡大縮小されないようにするres/drawable-nodpi/場合はres/drawable-anydpi/またはを使用します
CommonsWare 2016

3
「さまざまな異なるリソースディレクトリにある100x100ピクセルの画像は、実際にスケーリングされて、レイアウトに進む前に、仮想の異なる解像度バージョンが作成されると言っていますか?」-これは、使用している密度と実行しているデバイスによって異なります。完全に一致する場合、何もリサンプリングされません。完全に一致するものがない場合は、近くの濃度の画像がリサンプリングされます。したがって、res/drawable/foo.png(aka、res/drawable-mdpi/foo.png)しかなく、デバイスがxhdpi、の場合、画像は両方の軸に沿って2倍になり、4倍のメモリを消費します。
CommonsWare 2016

4
エラーの106975232値は、たまたま画像解像度の49倍であり、両方の軸に沿って7倍のリサンプリングを意味します。それは私が予想していたよりもはるかに高いです。私は...機会がなかった、まだ私は増え続けるto-doリストにあることを追加しますので、アンドロイド7.0の表示サイズの設定をいじっする
CommonsWare

6
49xでいいキャッチ!なぜこんなに高いのか説明できると思います。その数はバイトであることに注意してください。この画像は24ビットですが、おそらく32ビット/ピクセルで読み込まれます。これにより、メモリ内で8732672バイトになり、その数値は正確に12.25回になります。これは、各軸に沿って3.5倍のスケーリングを意味します。このデバイスはxxhdpiなので、ほぼ正しいようです。いずれにせよ、リソースがそのようにリサンプリングされるとは思いもしませんでした。お手伝いありがとう!(ちなみに、画像をdrawable-nodpiに移動すると、実際に修正されます。)
Brian Rak

1
あなたは本当にヨハンの答えを受け入れるべきです–S
。ジェイコブパウエル

回答:


167

私の場合、(高解像度の)スプラッシュビットマップを 描画可能描画可能xxhdpiは、溶液でした。

私も同じ問題を抱えていました。スプラッシュ画面はアプリの起動時に表示されるので問題ないと思いましたが、スプラッシュ画面が問題であることわかりました。

私の場合はスプラッシュ画面がxxhdpi解像度を持ち、それは誤ってに入れた描画可能なのではなく、フォルダ描画可能xxhdpi。これにより、Androidはスプラッシュ画面の解像度がmdpiであると想定し、画像を必要なサイズの3 * 3倍に拡大縮小して、ビットマップを作成しようとしました。


1
私は推測しています:それで、Androidは画像をxxhdpiからhdpiにスケーリングして、たとえばより明るい画像にしますか?たとえば、3 * 3-> 1/1から1/3まで言ったように?
忍者コーディング

kalsara Magamageが指摘しているように、これは現在mipmap-xxhdpiです。
Dana Robinson

37

android:行の間のマニフェストファイルのアプリケーションタグに以下のコードを追加した後、問題を解決しました。

android:hardwareAccelerated="false"

3
まあ、数時間を費やした後、このソリューションはxiaomiとSamsungのモバイルの問題に有効です。
ShihabUddin19年

4
これにより、CardViewのすべての標高が無効になります。したがって、適切な解決策は、ビットマップをより小さなサイズにスケーリングすることです。
SachinSoma20年

1
アプリケーションレベルでハードウェアアクセラレーションを無効にする代わりに、アクティビティ、ウィンドウ、ビューレベルでハードウェアアクセラレーションを制御する方が便利です。
Mukhammadsher

1
しかし、実行後に他の問題が発生しandroid:hardwareAccelerated="false" ます。22.以下のAPIレベルを有するいくつかのデバイスにおける奇数ビューを示す
プリンスDholakiya

3
そうしないでください、それはあなたのアプリを遅くします。
骨董

11

誰かに役立つかどうかはわかりませんが、ここに残しておきます。私の場合、問題はAndroid 7を搭載したSumsungデバイスでのみ発生し、問題はスプラッシュ画面の比率にありました。高さを1024ピクセルに変更した後-すべてが正常に機能します


私の問題は、ドローアブル(サフィックスなし)フォルダのビットマップ(jpg、png)でした。それは私の愚かですが、多分それは誰かを助けます:-)
gingo 2017年

これは役に立ちます!サムスンだけの同じ問題...あなたは最初に何を持っていましたか、そしてどのようにそれを修正しましたか?
M'hamed 2018

URLから画像を読み込もうとしていましたか。Android7のSamsungGalaxy S6でのみ同じ問題が発生します。RecyclerViewで画像を読み込んでいます。私はまだこれを理解することはできません。M'hamed @
ロフィット・シン

9

ドローアブル内の画像をmipmap-xxhdpiに移動します。画像はビットマップ形式であるため、画像をmipmapフォルダーに配置する必要があります。そうすれば機能します。


1
ミップマップフォルダはランチャーアイコン専用です。私はそれを他の目的に使ったことがありません。stackoverflow.com/a/28065664/4034572
Albert VilaCalvo19年

ええ、これは私のために働いた。画像サイズは約1MBで、mipmap-xxhdpi


3

ピカソを使用する場合は、このようにグライドに変更してください。

ピカソを削除

Picasso.get().load(Uri.parse("url")).into(imageView)

グライドを変更

Glide.with(context).load("url").into(imageView)

もっと効率的な


ピカソからグライドに切り替えてもエラーが発生します。サムスンJ6電話。そしてMotoZ2 :(
RohitSingh20年

2

オリジナルのビットマップをImageViews、写真編集アプリなどに描画する必要があるシナリオがいくつかあります...、

上記のベイの設定として

android:hardwareAccelerated="false"

UIエクスペリエンスが低下します。hardwareAcceleratedを設定できます。高解像度の画像が描画される選択されたアクティビティは1つだけです。

<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

0

アイコンファイルが大きすぎるため、Androidを効率的かつスムーズにロードできません。Androidは、スマートアルゴリズムでこれを認識します。

Final AndroidResizerを使用してアイコンファイルのサイズを変更できますasystatで。それらのサイズを「xhdpi」以下に変更します。

サイズ変更した写真をドローアブルに配置するか、既存の大きなアイコンファイルを上書きします。

これで完了です。


0

グライドを使用していて、一度に1kの画像またはいくつかの画像をロードしている場合は、グライドまたは画像ビューの設定に使用しているものの問題です。グライドでスケールタイプを適用するだけで解決できます。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.