Android中GIF動(dòng)圖的播放控制和監(jiān)聽詳解
前言
最近接手的項(xiàng)目里涉及到了 GIF 動(dòng)圖的播放與監(jiān)聽,在上一版本中對(duì)于 GIF 的處理是由 H5 來實(shí)現(xiàn)的,因?yàn)榭紤]到用戶體驗(yàn),因此現(xiàn)在的需求是將這塊兒原生化,途中差點(diǎn)誤入歧途!下面來看看詳細(xì)的介紹吧。
Android 中 GIF 動(dòng)圖處理與監(jiān)聽
剛開始第一個(gè)想到的便是 glide , 但是自認(rèn)為 glide 不能夠控制 GIF 以及去監(jiān)聽它,所以網(wǎng)上去搜尋別的方法??吹接幸粋€(gè)方案是將圖片分幀,一張張的去用逐幀動(dòng)畫來實(shí)現(xiàn)。
我開始懷疑給這個(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)的,有什么方式可以停下來呢!沒遇到過千萬別說沒必要,假如現(xiàn)在有一個(gè)需求,需要點(diǎn)擊一下按鈕來播放一次 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; /** * 加載開門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開發(fā)者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android開發(fā)控制ScrollView滑動(dòng)速度的方法
這篇文章主要介紹了Android開發(fā)控制ScrollView滑動(dòng)速度的方法,結(jié)合實(shí)例形式分析了Android編程中ScrollView滑動(dòng)事件相關(guān)操作技巧,需要的朋友可以參考下2017-02-02Android實(shí)現(xiàn)伸縮彈力分布菜單效果的示例
本文介紹下在Android中實(shí)現(xiàn)伸縮彈力分布菜單效果。這種效果比較炫酷,有需要的朋友可以參考一下。2016-10-10Android播放assets文件里視頻文件相關(guān)問題分析
這篇文章主要介紹了Android播放assets文件里視頻文件相關(guān)問題分析,結(jié)合Android播放assets文件出現(xiàn)錯(cuò)誤的實(shí)際問題給出了原因分析與解決方法參考,需要的朋友可以參考下2016-08-08Android從系統(tǒng)Gallery獲取圖片具體實(shí)現(xiàn)
這篇文章主要介紹了Android從系統(tǒng)Gallery獲取圖片具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-12-12Android項(xiàng)目類似淘寶 電商 搜索功能,監(jiān)聽軟鍵盤搜索事件,延遲自動(dòng)搜索,以及時(shí)間排序的搜索歷史記錄的實(shí)現(xiàn)
本篇文章主要介紹了Android實(shí)現(xiàn)類似淘寶、電商、搜索功能(監(jiān)聽軟鍵盤搜索事件,延遲自動(dòng)搜索,以及時(shí)間排序的搜索歷史記錄),感興趣的小伙伴們可以參考一下。2016-10-10android 通知Notification詳解及實(shí)例代碼
這篇文章主要介紹了android 通知Notification詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12Android 獲取系統(tǒng)語(yǔ)言的實(shí)例(兼容7.0)
下面小編就為大家?guī)硪黄狝ndroid 獲取系統(tǒng)語(yǔ)言的實(shí)例(兼容7.0)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05在Android系統(tǒng)中使用gzip進(jìn)行數(shù)據(jù)傳遞實(shí)例代碼
HTTP協(xié)議上的GZIP編碼是一種用來改進(jìn)WEB應(yīng)用程序性能的技術(shù),4.4MB的文本數(shù)據(jù)經(jīng)過Gzip傳輸?shù)娇蛻舳酥笞優(yōu)?92KB,壓縮效率極高,下面與大家分享下具體的實(shí)現(xiàn)2013-06-06Flutter?Android多窗口方案落地實(shí)戰(zhàn)
這篇文章主要為大家介紹了Flutter?Android多窗口方案落地實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02