`

Android播放GIF动画

 
阅读更多
Android支持GIF动画,但是如果利用ImageView标签直接写在布局文件中:
<ImageView android:id="@+id/gifpicture" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:src="@drawable/animation"    />

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


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


animation.gif是需要播放的GIF动画。
MainActivity实现了加载GIF动画的功能。
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动画。解释一下:
mMovie = Movie.decodeStream(getResources().openRawResource(R.drawable.animation));

将GIF动画以文件流的形式转换成Movie。
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/
  • 大小: 11.5 KB
  • 大小: 38.8 KB
  • 大小: 14.9 KB
  • 大小: 9.5 KB
分享到:
评论
19 楼 zjhangia 2014-08-19  
在4.0中关闭硬件加速就可以了在配置文件中加入android:hardwareAccelerated="false"
详细请参照http://blog.csdn.net/gucun4848/article/details/7991713
18 楼 zjhangia 2014-08-19  
在4.0中关闭硬件加速就可以了在配置文件中加入android:hardwareAccelerated="false"
详细请参照android:hardwareAccelerated="true"
17 楼 jikun 2014-07-08  
你好楼主  我问下https://github.com/koral--/android-gif-drawable  如何用啊 我试了但是不行啊
16 楼 luwei35910 2014-04-22  
楼主你好 我的是大一点帧数多的动画可以播放
帧数少的 int dur = mMovie.duration(); 会为0值
这时候就显示静态图片了 请问如何破
15 楼 fengkang 2014-01-17  
gundumw100 写道
zhwanwslj 写道
LZ你好,我试了下Movie播放gif,但是在2.3的系统上可以很好的播放,但在4.0的系统上却不能显示更不能播放,这个你有试过吗


你可以试试这个,不过它是用jni实现的
android-gif-drawable 支持fig显示的view
https://github.com/koral--/android-gif-drawable

你把那个控件的硬件加速属性关闭应该就可以了,3.0以上是默认开启硬件加速的
14 楼 zhwanwslj 2014-01-16  
gundumw100 写道
zhwanwslj 写道
LZ你好,我试了下Movie播放gif,但是在2.3的系统上可以很好的播放,但在4.0的系统上却不能显示更不能播放,这个你有试过吗


你可以试试这个,不过它是用jni实现的
android-gif-drawable 支持fig显示的view
https://github.com/koral--/android-gif-drawable

JNI不是很熟练,在4.0系统上你试过Movie播放gif吗?或者这个问题有什么解决方法吗?谢谢
13 楼 gundumw100 2014-01-15  
zhwanwslj 写道
LZ你好,我试了下Movie播放gif,但是在2.3的系统上可以很好的播放,但在4.0的系统上却不能显示更不能播放,这个你有试过吗


你可以试试这个,不过它是用jni实现的
android-gif-drawable 支持fig显示的view
https://github.com/koral--/android-gif-drawable
12 楼 zhwanwslj 2014-01-15  
LZ你好,我试了下Movie播放gif,但是在2.3的系统上可以很好的播放,但在4.0的系统上却不能显示更不能播放,这个你有试过吗
11 楼 李传智 2013-12-30  
能留下,联系方式吗,我有个问题请教你,我的qq :794987885
10 楼 gundumw100 2013-12-27  
带个回家 写道
onDraw里面有 invalidate();   ? 并且没有判断 ? 不就死循环了么 ? 真不知道那些说试过了没问题是不是人有问题 ?


是谁规定了一定要判断呢?就不能一直这样“循环动画”下去?
9 楼 带个回家 2013-12-27  
onDraw里面有 invalidate();   ? 并且没有判断 ? 不就死循环了么 ? 真不知道那些说试过了没问题是不是人有问题 ?
8 楼 lyx0206331 2013-12-05  
我这里没法播放啊
7 楼 fengkang 2013-09-12  
顶,3m多的图都可以正常显示没有oom错误!
6 楼 gundumw100 2013-05-28  
kikiash 写道
那如果想在这一屏幕的其他地方再显示其他东西要写在哪呢?

你一定是新手。这个问题等你搞通了android再说。
5 楼 kikiash 2013-05-28  
那如果想在这一屏幕的其他地方再显示其他东西要写在哪呢?
4 楼 Jj1105190650 2013-04-07  
将好多图片放到ListView里面,发现程序直接退出,求解
3 楼 etjnety 2012-09-11  
顶,太给力了,学习了
2 楼 f839903061 2012-08-20  
ok了,我试过 了,没问题!哈哈哈哈哈
1 楼 紫雨1206 2012-04-17  
为什么我的还是只播第一帧啊

相关推荐

Global site tag (gtag.js) - Google Analytics