Android播放GIF动画

Android支持GIF动画,但是如果利用ImageView标签直接写在布局文件中:
Xml代码 复制代码 收藏代码
  1. <ImageView android:id="@+id/gifpicture"  
  2. android:layout_width="fill_parent"  
  3. android:layout_height="wrap_content"  
  4. android:src="@drawable/animation"    /> 

程序只能加载GIF动画的第一帧。效果如下:


如果想要正常播放GIF动画,需要借助Movie实现。写了一个简单示例,程序目录结构如下:


animation.gif是需要播放的GIF动画。
MainActivity实现了加载GIF动画的功能。
Java代码 复制代码 收藏代码
  1. public class MainActivity extends Activity {  
  2.      
  3.     private Movie mMovie;  
  4.     private long mMovieStart; 
  5.     /** Called when the activity is first created. */  
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.        setContentView(new CustomGifView(this));  
  10.           } 
  11.     class CustomGifView extends View { 
  12.         public CustomGifView(Context context) {  
  13.             super(context);  
  14.             mMovie = Movie.decodeStream(getResources().openRawResource(  
  15.                     R.drawable.animation)); 
  16.         }  
  17.          
  18.         public void onDraw(Canvas canvas) { 
  19.             long now = android.os.SystemClock.uptimeMillis();  
  20.              
  21.             if (mMovieStart == 0) { // first time  
  22.                 mMovieStart = now;  
  23.             }  
  24.             if (mMovie != null) {  
  25.                  
  26.                 int dur = mMovie.duration();  
  27.                 if (dur == 0) {  
  28.                     dur = 1000;  
  29.                 }  
  30.                 int relTime = (int) ((now – mMovieStart) % dur);                 
  31.                 mMovie.setTime(relTime);  
  32.                 mMovie.draw(canvas, 0, 0);  
  33.                 invalidate();  
  34.             }  
  35.         } 
  36.     } 

内部类CustomGifView 利用Movie播放GIF动画。解释一下:
Java代码 复制代码 收藏代码
  1. mMovie = Movie.decodeStream(getResources().openRawResource(R.drawable.animation)); 

将GIF动画以文件流的形式转换成Movie。
Java代码 复制代码 收藏代码
  1. public void onDraw(Canvas canvas) { 
  2.         long now = android.os.SystemClock.uptimeMillis();  
  3.          
  4.         if (mMovieStart == 0) { // first time  
  5.             mMovieStart = now;  
  6.         }  
  7.         if (mMovie != null) {  
  8.              
  9.             int dur = mMovie.duration();  
  10.             if (dur == 0) {  
  11.                 dur = 1000;  
  12.             }  
  13.             int relTime = (int) ((now – mMovieStart) % dur);                 
  14.             mMovie.setTime(relTime);  
  15.             mMovie.draw(canvas, 0, 0);  
  16.             invalidate();  
  17.         }  
  18.     } 

   invalidate();作用是刷新当前View,这样onDraw方法重复执行,Movie就能画出GIF动画的每一帧。到此,GIF动画就能正常播放了。



源代码见:http://bigcateasymorse.googlecode.com/svn/trunk/android_gif_demo/
posted @ 2012-09-07 00:23  子福当自强  阅读(430)  评论(0编辑  收藏  举报
悟道