5

そのため、ギャラリー アプリでネイティブ イメージを表示するために、この素​​晴らしいライブラリGlideを使用しています。ViewPagerwithを使用しFragmentStatePagerAdapterてフルサイズの画像を表示しています。ページャのオフスクリーン制限は1(メモリを節約するためのデフォルト) です。このコードを使用しViewPagerて、フラグメントに画像をロードしています:

Glide.with(getActivity())
     .loadFromMediaStore(uri)
     .asBitmap()
     .signature(new MediaStoreSignature(mimeType, dateModified, 
     .into(mImageView);

今、私はここで次のようないくつかの問題に直面しています:

  1. 画像のロードにはかなりの時間がかかります (キャッシュされていない場合)。そのため、ユーザーがビューページャーをスクロールしている間、画像の読み込み中に空白の画面が表示されますが、これは避けたいことです。これを行う方法はありますか?たぶん、画像を事前にキャッシュすることによって?
  2. 大きなサイズの画像 (主にカメラの写真) をスクロールしているときに、OOM 例外がスローされ、画像が読み込まれないため、空白の画面が表示されることがあります。これは、ポートレイト モードからランドスケープ モードに移行するときにも発生します。それで、私は次のような方法を使用しようとしました--画像が既に読み込まれatMost()ているため、画像の品質をさらに低下させ、OOMも引き起こしています。OOM 例外を発生させずに最高の画質を実現するにはどうすればよいですか?RGB_565approximate()

2 番目の問題については、オフスクリーン アイテムの低品質の画像を読み込み、画面に表示されたときに品質を向上させることを考えていました。出来ますか?

私も使用しようとしましARGB_8888たが、結果は同じでした: OOM 例外。

4

1 に答える 1

23

TL;DR

  • 寸法が Glide にフル解像度のビットマップをロードさせるように、 ImageViewhasmatch_parentまたは fixedであることを確認してください。dp
    wrap_content
  • .placeholder()大きなビットマップのロード中に空白の代わりに画像を表示する
  • .thumbnail(float)大きな画像がバックグラウンドで読み込まれている間に、ダウンサンプリングされたバージョンを高速で読み込みます
  • また、グライドの問題を調べてみてください。役立つものが見つかるかもしれません。

詳細

ImageView私の推測ではwrap_content、フル解像度で画像を s にロードする結果になるためBitmap(大量のメモリを使用) 、xml が の xml とは何か知りたいと思います。その場合は、使用match_parentまたは修正dpして解像度を下げることをお勧めします。注: 詳細は使用しません。現在、画像はとにかくレンダリング時にダウンサンプリングされており、それをデコード フェーズに進めるだけです。

また、アプリにメモリ使用量の制約がないことを確認する必要があります。3 (画面外の制限 = 1 は1+current+1ページを意味する) カメラの写真を Glide なしでビットマップにロードできますか? 繰り返しますが、これがフル解像度であると仮定すると、Glide の有無にかかわらず、3 画面サイズのバイト量をメモリに保存できるはずですが、フル解像度でロードしないように Glide をガイドする必要があります。

を介してより小さいサイズの画像を読み込むことができます。これは、完全な値を含まない.thumbnail()ものを受け入れます。または、パーセンテージのみの省略形のパラメーター( ) があります。最初に後者を試してください。特に 0.1 のような非常に小さい数値の場合は、イメージのデコードがはるかに高速になり、高品質のイメージが終了すると置き換えられます。Glide.with....into()0.0 ... 1.0

したがって、より簡単なオプションは.thumbnail()、現在の負荷に追加することです。より複雑な方法では、のビューが作成されると.sizeMultiplier()同時に低解像度の画像の読み込みを開始し、ページが変更されたときに高解像度の画像の読み込みを開始します。これは、ページを覗くのに役立ちます。FragmentViewPager

.placeholder()または、画像の読み込み中に a を使用して、空のスペースではなく「何か」を使用することもできます。

(1 ピクセルあたり 32 ビット) の使用についてARGB_8888: s によって消費されるメモリを増やした場合((1 ピクセルあたり 16 ビット)Bitmapと比較しRGB_565て、後でメモリが不足することを期待しないでください。565 で動作するようになったら、増やしてみてください。しかし、それまでは無駄な努力です。

また、グライドの問題を調べてみてください。役立つものが見つかるかもしれません。

于 2015-06-25T23:15:05.293 に答える