当前位置:首页 > android 显示动态gif图片的方法

android 显示动态gif图片的方法

点击次数:3763  更新日期:2013-07-08

在android开发中,有时需要显示动态的gif图片,但是如果使用ImageView,图片不会显示出来。

这时,就需要写一个自定义控件


public class GifView extends ImageView{\r\npublic GifView(Context context, AttributeSet attrs) {\r\n        super(context, attrs);\r\n        // TODO Auto-generated constructor stub\r\n        int rid=attrs.getAttributeResourceValue("http://schemas.android.com/apk/res/android", "src", 0);\r\n        Log.i("gif",String.valueOf(rid));\r\n        movie=Movie.decodeStream(context.getResources().openRawResource(rid));\r\n    }\r\nprivate long movieStart;\r\nprivate Movie movie;\r\n    //此处必须重写该构造方法\r\n      \r\n@Override\r\nprotected void onDraw(Canvas canvas) {\r\n    long curTime=android.os.SystemClock.uptimeMillis();\r\n    //第一次播放\r\n    if (movieStart == 0) {\r\n        movieStart = curTime;\r\n    }\r\n    if (movie != null) {\r\n        int duraction = movie.duration();\r\n        int relTime = (int) ((curTime-movieStart)%duraction);\r\n        movie.setTime(relTime);\r\n        movie.draw(canvas, 0, 0);\r\n        //强制重绘\r\n        invalidate();\r\n    }\r\n    super.onDraw(canvas);\r\n    }\r\n}

xml布局文件的调用方法

<x.view.Custom.GifView\r\n        android:id="@+id/list6_Img1"\r\n        android:layout_width="20dp"\r\n        android:layout_height="20dp"\r\n        android:gravity="center"\r\n        android:scaleType="centerCrop"\r\n        android:src="@drawable/loading" />


另外的方法:

在android源代码的external目录下有一个名为giflib的文件夹,它就是gif解码器,通过插件的方式加载到skia里面,但是为什么应用开发的时候不能显示gif而只能显示一帧图片呢?

原因是这样的,android默认开发都是用模拟器来做的,而我上篇文章里面也有说道,模拟器的内存资源和cpu资源都是相当有限的,仅为256M 内存,对于各种资源要求的应用和功能来说,这样的资源显然远远不够,所以,google为了保证它的模拟器不会“随时死机”,对这部分的内容,悄悄的做了一点点的修改。而好巧不巧的是,这个意图居然被鄙人发现了,更加好巧不巧的是,这个修改是在是太有吸引力了,太精妙了,引发了我强大的好奇心,于是,我一头钻了进去。实在是有点凑巧,这个修改还被我发现了...

接着,我修改了webkit部分源代码(webkit关于图形解析的部分调用了skia的实现),惊奇的发现,百度一下gif图片,android 的浏览器居然可以播放gif了,不过很显然,这种超负荷的工作模拟器显然是无法正常完成的,我使用的是我上篇文章中提到的android-x86系统做的实验。

这样一来,应用程序开发者就可以顺利成章的使用webview类来完成gif格式图片的显示了。当然,在这之前,还需要做以下工作:

1、下载一份android-x86或者android的源代码(推荐使用android-x86,这真的是个很好用也很有意思的东西,当然,如果你坚持要用模拟器,我也不拦你,甜果子不吃非挑苦的吃那是你的权利)

2、修改源代码并编译

3、编译生成system.img、userdata.img和ramdisk.img

4、将这三个img文件替换掉你的sdk工具里面的那三个img文件