在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文件