1. 程式人生 > >Android 顯示gif動畫

Android 顯示gif動畫




在這裡主要用的是:android中的android.graphics.Movie 這個類,這是android提供給我們的一個非常方便的工具。

首先,重寫控制元件View,自定義一個展示gif圖的GifView,程式碼如下:

  1. package net.loonggg.gif.view;  
  2. import net.loonggg.gif.R;  
  3. import android.annotation.SuppressLint;  
  4. import android.content.Context;  
  5. import android.content.res.TypedArray;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Movie;  
  8. import android.os.Build;  
  9. import android.util.AttributeSet;  
  10. import android.view.View;  
  11. publicclass GifView extends View {  
  12.     /** 
  13.      * 預設為1秒 
  14.      */
  15.     privatestaticfinalint DEFAULT_MOVIE_DURATION = 1000;  
  16.     private
    int mMovieResourceId;  
  17.     private Movie mMovie;  
  18.     privatelong mMovieStart;  
  19.     privateint mCurrentAnimationTime = 0;  
  20.     privatefloat mLeft;  
  21.     privatefloat mTop;  
  22.     privatefloat mScale;  
  23.     privateint mMeasuredMovieWidth;  
  24.     privateint mMeasuredMovieHeight;  
  25.     private
    boolean mVisible = true;  
  26.     privatevolatileboolean mPaused = false;  
  27.     public GifView(Context context) {  
  28.         this(context, null);  
  29.     }  
  30.     public GifView(Context context, AttributeSet attrs) {  
  31.         this(context, attrs, R.styleable.CustomTheme_gifViewStyle);  
  32.     }  
  33.     public GifView(Context context, AttributeSet attrs, int defStyle) {  
  34.         super(context, attrs, defStyle);  
  35.         setViewAttributes(context, attrs, defStyle);  
  36.     }  
  37.     @SuppressLint("NewApi")  
  38.     privatevoid setViewAttributes(Context context, AttributeSet attrs,  
  39.             int defStyle) {  
  40.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {  
  41.             setLayerType(View.LAYER_TYPE_SOFTWARE, null);  
  42.         }  
  43.         // 從描述檔案中讀出gif的值,創建出Movie例項
  44.         final TypedArray array = context.obtainStyledAttributes(attrs,  
  45.                 R.styleable.GifView, defStyle, R.style.Widget_GifView);  
  46.         mMovieResourceId = array.getResourceId(R.styleable.GifView_gif, -1);  
  47.         mPaused = array.getBoolean(R.styleable.GifView_paused, false);  
  48.         array.recycle();  
  49.         if (mMovieResourceId != -1) {  
  50.             mMovie = Movie.decodeStream(getResources().openRawResource(  
  51.                     mMovieResourceId));  
  52.         }  
  53.     }  
  54.     /** 
  55.      * 設定gif圖資源 
  56.      *  
  57.      * @param movieResId 
  58.      */
  59.     publicvoid setMovieResource(int movieResId) {  
  60.         this.mMovieResourceId = movieResId;  
  61.         mMovie = Movie.decodeStream(getResources().openRawResource(  
  62.                 mMovieResourceId));  
  63.         requestLayout();  
  64.     }  
  65.     publicvoid setMovie(Movie movie) {  
  66.         this.mMovie = movie;  
  67.         requestLayout();  
  68.     }  
  69.     public Movie getMovie() {  
  70.         return mMovie;  
  71.     }  
  72.     publicvoid setMovieTime(int time) {  
  73.         mCurrentAnimationTime = time;  
  74.         invalidate();  
  75.     }  
  76.     /** 
  77.      * 設定暫停 
  78.      *  
  79.      * @param paused 
  80.      */
  81.     publicvoid setPaused(boolean paused) {  
  82.         this.mPaused = paused;  
  83.         if (!paused) {  
  84.             mMovieStart = android.os.SystemClock.uptimeMillis()  
  85.                     - mCurrentAnimationTime;  
  86.         }  
  87.         invalidate();  
  88.     }  
  89.     /** 
  90.      * 判斷gif圖是否停止了 
  91.      *  
  92.      * @return 
  93.      */
  94.     publicboolean isPaused() {  
  95.         returnthis.mPaused;  
  96.     }  
  97.     @Override
  98.     protectedvoid onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  99.         if (mMovie != null) {  
  100.             int movieWidth = mMovie.width();  
  101.             int movieHeight = mMovie.height();  
  102.             int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);  
  103.             float scaleW = (float) movieWidth / (float) maximumWidth;  
  104.             mScale = 1f / scaleW;  
  105.