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, 00);    
  33.                 invalidate();    
  34.             }    
  35.         }   
  36.     }   
  37. }  
public class MainActivity extends Activity { 
    
    private Movie mMovie; 
    private long mMovieStart;
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
       setContentView(new CustomGifView(this)); 
          }
    class CustomGifView extends View {
        public CustomGifView(Context context) { 
            super(context); 
            mMovie = Movie.decodeStream(getResources().openRawResource( 
                    R.drawable.animation));
        } 
        
        public void onDraw(Canvas canvas) {
            long now = android.os.SystemClock.uptimeMillis(); 
            
            if (mMovieStart == 0) { // first time 
                mMovieStart = now; 
            } 
            if (mMovie != null) { 
                
                int dur = mMovie.duration(); 
                if (dur == 0) { 
                    dur = 1000; 
                } 
                int relTime = (int) ((now – mMovieStart) % dur);                
                mMovie.setTime(relTime); 
                mMovie.draw(canvas, 0, 0); 
                invalidate(); 
            } 
        }
    }
}

内部类CustomGifView 利用Movie播放GIF动画。解释一下:
Java代码 复制代码  收藏代码
  1. mMovie = Movie.decodeStream(getResources().openRawResource(R.drawable.animation));  
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, 00);    
  16.             invalidate();    
  17.         }    
  18.     }  
public void onDraw(Canvas canvas) {
        long now = android.os.SystemClock.uptimeMillis(); 
        
        if (mMovieStart == 0) { // first time 
            mMovieStart = now; 
        } 
        if (mMovie != null) { 
            
            int dur = mMovie.duration(); 
            if (dur == 0) { 
                dur = 1000; 
            } 
            int relTime = (int) ((now – mMovieStart) % dur);                
            mMovie.setTime(relTime); 
            mMovie.draw(canvas, 0, 0); 
            invalidate(); 
        } 
    }

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



源代码见: http://bigcateasymorse.googlecode.com/svn/trunk/android_gif_demo/
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值