私のコード行が離陸するのを見て、Glide 読み込み GIF 最適化の練習を行ってください。

ここに画像の説明を挿入

序文

最近、プロジェクトで 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);

Supongo que te gusta

Origin blog.csdn.net/Android23333/article/details/131681886
Recomendado
Clasificación