日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Android应用系列:完美运行GIF格式的ImageView(附源码)

發布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用系列:完美运行GIF格式的ImageView(附源码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

  我們都知道ImageView是不能完美加載Gif格式的圖片,如果我們在ImageView中src指定的資源是gif格式的話,我們將會驚喜的發覺畫面永遠停留在第一幀,也就是不會有動畫效果。當然,經過略加改造,我們是可以讓gif在ImageView上完美加載的。

正文

  Android給我們提供了一個Movie類,可以讓我們實現加載gif格式資源的目標。我們需要導入android.graphics.Movie這個包,當然這個也是Android自帶的。所以我們的主要方法是繼承一個ImageView的子類,通過改寫其中的onDraw方法加載gif資源。話也不多說了,通過代碼大家看的更明白,文末附帶源碼哦。

PS:看懂本文需要了解自定義View的相關知識。

attrs資源文件:

<resources><declare-styleable name="GifView"> <attr name="isgifimage" format="boolean"/></declare-styleable>
</resources>

我在這里面設置了一個自定義屬性?isgifimage,目的是讓用戶自行設置控件顯示是否是gif格式資源,因為非gif格式資源用Movie加載也是可以顯示圖像,但是效率就肯定沒有原生控件加載模式好,當然,默認isgifimage為true,也就是默認為gif格式的資源。

自定義的GifView的構造函數(GifView類繼承ImageView)

public GifView(Context context, AttributeSet attrs) {super(context, attrs);//獲取自定義屬性isgifimageTypedArray array = context.obtainStyledAttributes(attrs, R.styleable.GifView);isGifImage = array.getBoolean(R.styleable.GifView_isgifimage, true);array.recycle();//獲取自定義屬性完畢后需要recycle,不然會對下次獲取造成影響//獲取ImageView的默認src屬性image = attrs.getAttributeResourceValue( "http://schemas.android.com/apk/res/android", "src", 0); movie = Movie.decodeStream(getResources().openRawResource(image));
}

在GifView的構造方法中,我們主要是對GifView的自定義屬性進行獲取。可以通過context.obtainStyledAttributes(attrs, R.styleable.GifView)返回一個TypedArray對象,然后從該對象分別獲取自定義屬性,在這里需要強調一點的時R.styleable.GifView_isgifimage,紅色的時attrs資源文件的名字,而藍色則是其對應的屬性名字(見attrs資源文件),中間以下劃線分隔。

在我們獲取完自定義屬性后必須recycle(),不然會對下次該控件獲取自定義屬性造成影響,因為TypedArray對象是公共資源。

然后我們在通過attrs.getAttributeResourceValue( "http://schemas.android.com/apk/res/android", "src", 0)來獲取ImageView的原生src屬性,并將其傳入movie實例中。

自定義GifView的onDraw方法

@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);//執行父類onDraw方法,繪制非gif的資源if(isGifImage){//若為gif文件,執行DrawGifImage(),默認執行
        DrawGifImage(canvas);}
}private void DrawGifImage(Canvas canvas) {//獲取系統當前時間long nowTime = android.os.SystemClock.currentThreadTimeMillis();if(movieStart == 0){//若為第一次加載,開始時間置為nowTimemovieStart = nowTime;}if(movie != null){//容錯處理int duration = movie.duration();//獲取gif持續時間//如果gif持續時間小于100,可認為非gif資源,跳出處理if(duration > 100){//獲取gif當前幀的顯示所在時間點int relTime = (int) ((nowTime - movieStart) % duration);movie.setTime(relTime);//渲染gif圖像movie.draw(canvas, 0, 0);invalidate();}}
}

在這個方法中,我們先對isGifImage是否為true進行判斷,如果開發者指定其為false則直接調用super.onDraw(canvas)繪制即可,而不必調用DrawGifImage()來降低效率,畢竟不斷的invalidate()對性能效率還是蠻大的。

如果要繪制gif資源,我們會根據系統的時間來推斷出當前時間點時gif資源所應該顯示的時間幀,相信大家看代碼更容易看懂,注釋也夠詳細的了,就不多講解了。

調用資源的xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:gifview="http://schemas.android.com/apk/res/com.net168.testgifview"android:layout_width="match_parent"android:layout_height="match_parent"><com.net168.gifview.GifViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/image"gifview:isgifimage="true"/>
</LinearLayout>

需要注意的一點就是?xmlns:gifview="http://schemas.android.com/apk/res/com.net168.testgifview",其中紅色部分GifView.java這個類所在的包名。

?

下面附上源碼(GifView.rar為lib工程,TestGIfView.rar為調試工程):MyGif.rar

?

作者:enjoy風鈴
出處:http://www.cnblogs.com/net168/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則下次不給你轉載了

轉載于:https://www.cnblogs.com/net168/p/4204797.html

總結

以上是生活随笔為你收集整理的Android应用系列:完美运行GIF格式的ImageView(附源码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。