Android中GIF動(dòng)圖的播放控制和監(jiān)聽(tīng)詳解
前言
最近接手的項(xiàng)目里涉及到了 GIF 動(dòng)圖的播放與監(jiān)聽(tīng),在上一版本中對(duì)于 GIF 的處理是由 H5 來(lái)實(shí)現(xiàn)的,因?yàn)榭紤]到用戶體驗(yàn),因此現(xiàn)在的需求是將這塊兒原生化,途中差點(diǎn)誤入歧途!下面來(lái)看看詳細(xì)的介紹吧。
Android 中 GIF 動(dòng)圖處理與監(jiān)聽(tīng)
剛開(kāi)始第一個(gè)想到的便是 glide , 但是自認(rèn)為 glide 不能夠控制 GIF 以及去監(jiān)聽(tīng)它,所以網(wǎng)上去搜尋別的方法??吹接幸粋€(gè)方案是將圖片分幀,一張張的去用逐幀動(dòng)畫來(lái)實(shí)現(xiàn)。
我開(kāi)始懷疑給這個(gè)解決方案的人了,都什么時(shí)代了還做這種費(fèi)力不討好,大量占用用戶內(nèi)存的東西!于是乎動(dòng)手前又仔細(xì) Google 了一番,答案著實(shí)令我尷尬,glide 是可以控制 GIF 動(dòng)畫的!??!
怒上代碼 :使用glide 加載 GIF 動(dòng)圖
Glide.with(DoorActivity.this).load(R.drawable.opendoor).into(openDoorGif);
很簡(jiǎn)單的一行代碼就可以搞定,以上方式圖片和動(dòng)圖都可以加載(網(wǎng)絡(luò)鏈接亦可)
下面是只可以加載 GIF 動(dòng)圖的寫法:
Glide.with(DoorActivity.this).load(R.drawable.opendoor).asGif().into(openDoorGif);
其實(shí)就多了個(gè) asGIF
但是這種方式下的動(dòng)圖播放一直是循環(huán)的,有什么方式可以停下來(lái)呢!沒(méi)遇到過(guò)千萬(wàn)別說(shuō)沒(méi)必要,假如現(xiàn)在有一個(gè)需求,需要點(diǎn)擊一下按鈕來(lái)播放一次 GIF 實(shí)現(xiàn)與用戶的交互呢?這個(gè)技能我想你肯定是要 get 的,因?yàn)轭愃菩枨竽氵t早會(huì)碰到!
下面寫法實(shí)現(xiàn)了對(duì) GIF 動(dòng)圖的控制
//handler發(fā)送消息成功的狀態(tài)碼
private static final int MESSAGE_SUCCESS = 4424;
//handler發(fā)送消息所攜帶的參數(shù)(持續(xù)時(shí)間)
private int duration;
/**
* 加載開(kāi)門Gif動(dòng)圖(只播放一次)
* @param view
*/
public void loadGif(View view){
Glide.with(this)
.load(R.drawable.opendoor)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.listener(new RequestListener<Integer, GlideDrawable>() {
@Override
public boolean onException(Exception arg0, Integer arg1,
Target<GlideDrawable> arg2, boolean arg3) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource,
Integer model, Target<GlideDrawable> target,
boolean isFromMemoryCache, boolean isFirstResource) {
// 計(jì)算動(dòng)畫時(shí)長(zhǎng)
GifDrawable drawable = (GifDrawable) resource;
GifDecoder decoder = drawable.getDecoder();
for (int i = 0; i < drawable.getFrameCount(); i++) {
duration += decoder.getDelay(i);
}
//發(fā)送延時(shí)消息,通知?jiǎng)赢嫿Y(jié)束
//以下兩個(gè)參數(shù)都是 int 型,記得如上的聲明
handler.sendEmptyMessageDelayed(MESSAGE_SUCCESS,
duration);
return false;
}
})
//僅僅加載一次gif動(dòng)畫
//此處的參數(shù) 1 及時(shí)指明播放次數(shù)
.into(new GlideDrawableImageViewTarget(openDoorGif, 1));
}
使用這種方式就可以完美的實(shí)現(xiàn)對(duì) GIF 的控制,對(duì)我遇到的需求提供了良性支持!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)給位Android開(kāi)發(fā)者們能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android如何監(jiān)聽(tīng)屏幕旋轉(zhuǎn)
這篇文章主要介紹了如何監(jiān)聽(tīng)Android屏幕旋轉(zhuǎn),幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下2021-03-03
Android實(shí)現(xiàn)九宮格橫向左右滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)九宮格橫向左右滑動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
android基本控件ToggleButton&Switch使用指南
本文給大家匯總介紹了android的2個(gè)基本控件ToggleButton和Switch的使用方法,非常的詳細(xì),有需要的小伙伴可以參考下。2016-01-01
android 版本檢測(cè) Android程序的版本檢測(cè)與更新實(shí)現(xiàn)介紹
做個(gè)網(wǎng)站的安卓客戶端,用戶安裝到自己手機(jī)上,如果我出了新版本怎么辦呢?要有版本更新功能,感興趣的朋友可以了解下2013-01-01
Android自定義View實(shí)現(xiàn)帶4圓角或者2圓角的效果
這篇文章主要介紹了Android自定義View實(shí)現(xiàn)帶4圓角或者2圓角的效果,本文通過(guò)實(shí)例代碼截圖給大家展示的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android項(xiàng)目開(kāi)發(fā) 教你實(shí)現(xiàn)Periscope點(diǎn)贊效果
這篇文章主要為大家分享了Android項(xiàng)目開(kāi)發(fā),一步一步教你實(shí)現(xiàn)Periscope點(diǎn)贊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12
Android實(shí)現(xiàn)第三方授權(quán)登錄、分享以及獲取用戶資料
本篇文章介紹了Android實(shí)現(xiàn)第三方授權(quán)登錄、分享以及獲取用戶資料,詳細(xì)的介紹了第三方授權(quán)登錄的實(shí)現(xiàn)代碼,有需要的朋友可以了解一下。2016-11-11

