序文
最近、プロジェクトで gif アニメーションが使用されるようになり、Glide (GIF をサポート) ライブラリが導入されたため、Glide を使用してロードしていますが、使用する過程でまだ多くの困難に遭遇しました。
1. グライドロードGIF
1. 依存関係をプロジェクトに追加する
dependencies {
compile 'com.github.bumptech.glide:glide:4.0.0'
compile 'com.android.support:support-v4:25.3.1'
}
Glide はサポート ライブラリ v4 に依存する必要があります
2. 画像をロードする
// For a simple view:
@Override public void onCreate(Bundle savedInstanceState) {
...
ImageView imageView = (ImageView) findViewById(R.id.my_image_view);
Glide.with(this)
.load("http://goo.gl/gEgYUd")
.into(imageView);
}
// For a simple image list:
@Override public View getView(int position, View recycled, ViewGroup container) {
final ImageView myImageView;
if (recycled == null) {
myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false);
} else {
myImageView = (ImageView) recycled;
}
String url = myUrls.get(position);
Glide
.with(myFragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.into(myImageView);
return myImageView;
}
//不使用它的默认动画
Glide.with(mContext)
.load(url)
.dontAnimate()
.placeholder(R.drawable.loading_spinner)
.into(circleImageview);
ヒント: 非メインスレッドで画像をロードするために Glide を使用しないでください。実際に使用する場合は、context パラメーターを getApplicationContext に置き換えてください。
3. GIFをロードする
単にgifをロードするだけであれば、実際には通常の画像をロードするのと同じです
Glide.with(this).load(mGifUrl).placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);
gif を読み込むときに gif の最初のフレームだけを読み込み、gif を通常の画像として読み込む場合は、asBitmap メソッドを追加するだけで済みます。
Glide.with(this).load(mGifUrl).asBitmap().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);
gifのみをロードしたい場合、gifではない場合は間違った画像が表示されますので、asGifメソッドを追加してください。
Glide.with(this).load(mGifUrl).asGif().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);
インターネット上の多くの記事は、Glide がローカル ビデオをロードできるという翻訳からコピーされたものですが、その翻訳では一文が抜けています。Glide はローカル ビデオの最初のフレーム (サムネイル) のみをロードします。実際、サムネイルをロードするときに URI を変換する必要はなく、ファイルをそこに投げ込むだけです。
mVideoFile = new File(Environment.getExternalStorageDirectory(), "xiayu.mp4");
Glide.with(this).load(mVideoFile).placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);
ほとんどの場合、diskCacheStrategy (DiskCacheStrategy.SOURCE) を使用すると、Gif の読み込み速度が大幅に向上します (実際には、GIF リソースをディスクにキャッシュします) -> GIF の読み込みが遅い、または読み込めないという状況を解決できます (NONE はデータ キャッシュがないことを意味し、SOURCE はキャッシュ プロトタイプ、元の画像です)
Glide.with(this).load(mGifUrl).diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder(R.mipmap.place)
.error(R.mipmap.icon_photo_error)
.into(mIv);
GIF 画像の数を動的に表示します。たとえば、GIF を 1 回表示したい場合は停止します。
Glide.with(this).load("url").diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(new GlideDrawableImageViewTarget(iv, 1));
GlideDrawableImageViewTarget(ImageView view, int maxLoopCount) メソッド、ここでは maxloopCount で表示時間を制御できます。
2、Glide 読み込み GIF の最適化
1. Glide の Gif の読み込みが非常に遅い問題を解決する
Glide.with(MainActivity.this).load(url).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView);
キャッシュ戦略を追加します。キャッシュ戦略は次のとおりです: ソースとなし、なしとキャッシュなし、ソース キャッシュ プロトタイプ。ALL と結果の場合、機能しません。
2. 最初のフレームをロードします。
Glide.with(context).load(gifUrl).asBitmap().into(imageViewGifAsBitmap);
3. アニメーションの数を制御します。
Glide.with(this).load(getResource()).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(new GlideDrawableImageViewTarget(imageView, 1));
4.GIF時間:
Glide.with(FirstActivity.this)
.load(file)
.asGif()
.fitCenter()
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.listener(new RequestListener<File, GifDrawable>() {
@Override
public boolean onException(Exception e, File model, Target<GifDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(final GifDrawable resource, File model, Target<GifDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
new Thread(new Runnable() {
@Override
public void run() {
int duration = 0;
try {
GifDrawable gifDrawable = (GifDrawable) resource;
GifDecoder decoder = gifDrawable.getDecoder();
for (int i = 0; i < gifDrawable.getFrameCount(); i++) {
duration += decoder.getDelay(i);
}
mGifAdTime = duration;
} catch (Throwable e) {
}
}
}).start();
return false;
}
})
.into(mAdImg);