如何把網(wǎng)站放到空間別人可以訪問今日新聞播報(bào)
Glide本身支持gif格式的動(dòng)畫加載,但是大多數(shù)情況下我們用Glide都是去加載一些靜態(tài)圖片,加載gif動(dòng)態(tài)圖的需求不是很多,因此這次使用Glide加載gif就遇到了一些令人匪夷所思的問題
問題一:加載gif圖片會(huì)有明顯的卡頓
通常情況下我們使用Glide去加載gif或一張圖片都是通過如下代碼來實(shí)現(xiàn)的,我們不需要考慮太多的參數(shù)
Glide.with(this).asGif().load(R.drawable.lucky_draw_anim).into(ivAward);
因此,如果你直接這樣做了,結(jié)果發(fā)現(xiàn)顯示出來的gif圖片會(huì)格外卡頓,但是卻找不到任何原因,而且原gif圖在瀏覽器上面也是足夠流暢的,幾乎看不到卡頓的現(xiàn)象
其實(shí)Glide還有一些額外的參數(shù)可以增加加載的流暢性,例如可以通過
diskCacheStrategy(DiskCacheStrategy.ALL)
方法開啟硬盤的緩存,并且Glide中通過
override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
方法用于指定加載的圖片尺寸,這樣可以使得gif的加載效率和顯示效果更流暢。
具體來說,Target.SIZE_ORIGINAL 表示使用圖片的原始尺寸進(jìn)行加載。這在某些情況下非常有用,例如當(dāng)你希望圖片以原始分辨率顯示時(shí),或者當(dāng)你需要確保圖片的清晰度和細(xì)節(jié)時(shí)。
ps:其他的一些緩存參數(shù)及解釋如下
DiskCacheStrategy 的幾種常見策略
DiskCacheStrategy.ALL
行為:緩存原始數(shù)據(jù)和轉(zhuǎn)換后的數(shù)據(jù)。
適用場景:適用于需要在不同尺寸和格式下都能快速加載圖片的情況。
DiskCacheStrategy.NONE
行為:不緩存任何數(shù)據(jù)。
適用場景:適用于不需要緩存圖片的情況,例如臨時(shí)圖片或敏感信息。
DiskCacheStrategy.DATA
行為:僅緩存原始數(shù)據(jù)。
適用場景:適用于需要緩存原始圖片數(shù)據(jù)但不需要緩存轉(zhuǎn)換后的數(shù)據(jù)的情況。
DiskCacheStrategy.RESOURCE
行為:僅緩存轉(zhuǎn)換后的數(shù)據(jù)。
適用場景:適用于需要緩存轉(zhuǎn)換后的圖片數(shù)據(jù)但不需要緩存原始數(shù)據(jù)的情況。
DiskCacheStrategy.AUTOMATIC
行為:根據(jù)圖片的來源自動(dòng)選擇緩存策略。
適用場景:適用于大多數(shù)情況,Glide 會(huì)根據(jù)圖片的來源自動(dòng)選擇最合適的緩存策略。
所以加載gif的完整代碼如下
Glide.with(APP.getContext()).asGif().load(R.drawable.lucky_draw_anim).diskCacheStrategy(DiskCacheStrategy.ALL).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).placeholder(R.drawable.center_bg_default).into(ivAward)
如果大家仔細(xì)看會(huì)發(fā)現(xiàn)with中傳遞的context使用的是Application的context,這便是下面我要說遇到的問題2
問題二:gif圖片會(huì)自動(dòng)重復(fù)播放
我通過setLoopCount(1)方法將gif的播放次數(shù)設(shè)置為1,即播放一次停止播放(不設(shè)置的話默認(rèn)則會(huì)連續(xù)循環(huán)播放動(dòng)畫),但是會(huì)發(fā)現(xiàn)如果僅是這樣設(shè)置,當(dāng)with方法傳遞的context是當(dāng)前Activity則會(huì)導(dǎo)致如果已經(jīng)播放過一次動(dòng)畫,然后跳轉(zhuǎn)到其他頁面再回來,動(dòng)畫會(huì)自動(dòng)再次播放...
后來聯(lián)想到Glide本身會(huì)跟隨生命周期于是想到是context導(dǎo)致的問題,于是with使用Application的Context便解決了這個(gè)問題,動(dòng)畫不會(huì)再重復(fù)播放了。
實(shí)現(xiàn)完整代碼如下:
Glide.with(APP.getContext()).asGif().load(R.drawable.lucky_draw_anim).diskCacheStrategy(DiskCacheStrategy.ALL).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).placeholder(R.drawable.center_bg_default).listener(new RequestListener<GifDrawable>() {@Overridepublic boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target<GifDrawable> target, boolean isFirstResource) {return false;}@Overridepublic boolean onResourceReady(@NonNull GifDrawable resource, @NonNull Object model, Target<GifDrawable> target, @NonNull DataSource dataSource, boolean isFirstResource) {if (gifDrawable == null) {gifDrawable = resource;// 設(shè)置播放次數(shù)gifDrawable.setLoopCount(1);gifDrawable.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {@Overridepublic void onAnimationStart(Drawable drawable) {super.onAnimationStart(drawable);}@Overridepublic void onAnimationEnd(Drawable drawable) {super.onAnimationEnd(drawable);// GIF播放完畢后的處理邏輯luckyDrawDialog.show();}});gifDrawable.start();}return false;}}).into(ivAward);