国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android中GIF動(dòng)圖的播放控制和監(jiān)聽詳解

2019-10-23 18:28:26
字體:
供稿:網(wǎng)友

前言

最近接手的項(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);

很簡單的一行代碼就可以搞定,以上方式圖片和動(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í)長     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é)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)給位Android開發(fā)者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 政和县| 金乡县| 古浪县| 全椒县| 霍州市| 白河县| 肇源县| 弥渡县| 牡丹江市| 疏勒县| 永川市| 新竹县| 哈巴河县| 曲沃县| 亚东县| 烟台市| 长岭县| 青田县| 梁山县| 乌苏市| 丽水市| 长葛市| 明溪县| 阳山县| 论坛| 二连浩特市| 东台市| 崇左市| 庄河市| 清苑县| 长兴县| 浙江省| 柳林县| 乡宁县| 三亚市| 洛南县| 洛南县| 三原县| 台南县| 锦屏县| 崇阳县|