- 浏览: 409352 次
- 性别:
- 来自: 福州
最新评论
-
野牛精:
感谢楼主分享,帮大忙了。
android ftp 客户端编写(ftp4j) -
happytianqiu:
你好,我最近也在搞这个,能发个demo吗,邮箱是:624951 ...
开发android机顶盒应用 事件,焦点处理 -
zhunanfengfeimeng:
http://www.iteye.comhttp://www. ...
android ftp 客户端编写(ftp4j) -
icyttea:
好棒!感谢楼主分享
vlc for android录制视频与截图 -
clwwlc:
有demo吗
开发android机顶盒应用 事件,焦点处理
gif的解析,显示,在google上有一位作者开放了源码,于是我也下载研究了下,的确可用, 不过些许问题,如,解析大一些的文件就会出现oome。
https://github.com/archko/GifView.git 这个是用c写的,android底层的gif也是相同的lib.
ndk编译时需要指定android-8以上,否则图像会有问题.
5.0以下系统可用,以上的暂时不可用.
我修改了下源码,模拟器上会因为图片过大无法解析。一张gif2.07m,解析完全 会有179帧,如果用png,100质量存储总有4.2m,在手机上只能解析128帧,其它因为内存不足无法解析,所以还是没有优化好。但是其它的图片到现在多数都解析成功了 ,有些不只是大小的问题,还关系到每帧高宽。3m+的gif图片解析也可以,但是那张2m的就不行。
废话不多了,现在介绍我的修改过程。
首先,原作者的地址为:http://code.google.com/p/gifview/
我只说我修改的部分:
先看decoder:
private Bitmap image; // current frame
private Bitmap lastImage; // previous frame
一个是存储当前的帧,一个存储上一帧.
为什么要存储上一帧呢?我也不大懂,猜是因为上一帧与当前的帧关联大,许多地方可以利用的.
从作者的代码来看,它提供了即时解析,解析一帧显示一帧.但是我考虑到,一张gif图片可能不是只从头到尾看一次,用户可能会想像pc的浏览器那样,动画完成后再从头开始,所以,我就把这些解析的帧存储在一个list里,解析完成后把list传到view中,然后就用线程处理画图的问题.
readContents()是读取内容的主要方法.其中的readImage就是读取图片了.而其它的方法读一些其它信息.我对gif了解不太多,也不能说出每个方法具体干什么的.
看原来的
完整的代码暂时不放上来了,可以参考原作者的代码,然后如果需要修改为int[]类型的值,传回去播放,最后的效果,可以从本人的微博程序中看到.
应网友要求把全部完整代码放上.但是上面说的进一步处理画图没有包含在内,我认为,如果你想得到一些什么,总是要付出的吧,像散架的汽车就等着组合 了,,code.google上已经上传了,在这里看看自己修改吧.性能影响不会太多
2012.4.17 gif.zip 完整的工程,在/sdcard/中放置test.gif就可以了,
最近又发现一个c写的lib,gif2png,解码部分可以拿出来,由于我对图像处理不熟悉,只能转换部分,虽然读取了整个gif文件,且解码了,但不知道如何将这些rgb值与一些char*等转为需要的像素值。
之前还有一个gifscile这是另外的解码方式,同样解码后不知道如何转为像素值。而且免费,随意使用。
现在把代码放上来,如果会转换的童鞋,可以帮忙弄下,工程里面已经相对完整了。Hello.zip里的jni目录gifread.c是读取gif的文件,/sdcard/test.gif必须
这种方式已经废除了,github上有gifviewer,用jni实现的.效果更好,更快速,直接解析指定帧,但5.0以上系统暂时无法 处理.导致崩溃
[img][b][i][u][/u][/i][/b][/img]
https://github.com/archko/GifView.git 这个是用c写的,android底层的gif也是相同的lib.
ndk编译时需要指定android-8以上,否则图像会有问题.
5.0以下系统可用,以上的暂时不可用.
我修改了下源码,模拟器上会因为图片过大无法解析。一张gif2.07m,解析完全 会有179帧,如果用png,100质量存储总有4.2m,在手机上只能解析128帧,其它因为内存不足无法解析,所以还是没有优化好。但是其它的图片到现在多数都解析成功了 ,有些不只是大小的问题,还关系到每帧高宽。3m+的gif图片解析也可以,但是那张2m的就不行。
废话不多了,现在介绍我的修改过程。
首先,原作者的地址为:http://code.google.com/p/gifview/
我只说我修改的部分:
先看decoder:
private Bitmap image; // current frame
private Bitmap lastImage; // previous frame
一个是存储当前的帧,一个存储上一帧.
为什么要存储上一帧呢?我也不大懂,猜是因为上一帧与当前的帧关联大,许多地方可以利用的.
从作者的代码来看,它提供了即时解析,解析一帧显示一帧.但是我考虑到,一张gif图片可能不是只从头到尾看一次,用户可能会想像pc的浏览器那样,动画完成后再从头开始,所以,我就把这些解析的帧存储在一个list里,解析完成后把list传到view中,然后就用线程处理画图的问题.
readContents()是读取内容的主要方法.其中的readImage就是读取图片了.而其它的方法读一些其它信息.我对gif了解不太多,也不能说出每个方法具体干什么的.
看原来的
private void readImage() { Log.d(TAG, "readImage."); ix=readShort(); // (sub)image position & size iy=readShort(); iw=readShort(); ih=readShort(); int packed=read(); lctFlag=(packed&0x80)!=0; // 1 - local color table flag interlace=(packed&0x40)!=0; // 2 - interlace flag // 3 - sort flag // 4-5 - reserved lctSize=2<<(packed&7); // 6-8 - local color table size if (lctFlag) { lct=readColorTable(lctSize); // read table act=lct; // make local table active } else { act=gct; // make global table active if (bgIndex==transIndex) { bgColor=0; } } int save=0; if (transparency) { save=act[transIndex]; act[transIndex]=0; // set transparent color if specified } if (act==null) { status=STATUS_FORMAT_ERROR; // no color table defined } if (err()) { return; } decodeImageData(); // decode pixel data skip(); if (err()) { return; } frameCount++; // create new image to receive frame data image=Bitmap.createBitmap(width,height,Config.ARGB_4444); // createImage(width, height); setPixels(); // transfer pixel data to image if (gifFrame==null) { gifFrame=new GifFrame(image,delay); currentFrame=gifFrame; } else { GifFrame f=gifFrame; while (f.nextFrame!=null) { f=f.nextFrame; } f.nextFrame=new GifFrame(image,delay); } // frames.addElement(new GifFrame(image, delay)); // add image to frame // list if (transparency) { act[transIndex]=save; } resetFrame(); action.parseOk(true,frameCount); } 可以看到image,这些建一个图,图片的生成是在setPixels里面的. 这个方法做的事比较多了. private void setPixels() { Log.d(TAG, "setPixels."); int[] dest=new int[width*height];建一个颜色数组.然后把它填充,就可以画出一张图片了. 里面的if (lastImage!=null) { lastImage.getPixels(dest,0,width,0,0,width,height); // copy pixels if (lastDispose==2) { // fill last image rect area with background color int c=0; if (!transparency) { c=lastBgColor; } for (int i=0;i<lrh;i++) { int n1=(lry+i)*width+lrx; int n2=n1+lrw; for (int k=n1;k<n2;k++) { dest[k]=c; } } } } 就是利用了上一帧的内容了. 然后再设置新的内容: if (line<height) { int k=line*width; int dx=k+ix; // start of line in dest int dlim=dx+iw; // end of dest line if ((k+width)<dlim) { dlim=k+width; // past dest edge } int sx=i*iw; // start of line in source while (dx<dlim) { // map color and insert in destination int index=((int)pixels[sx++])&0xff; int c=act[index]; if (c!=0) { dest[dx]=c; } dx++; } } 最后创建 图片: image=Bitmap.createBitmap(dest,width,height,Config.ARGB_4444); 然后它的帧是像c++那样,链接的,当前的帧有一个指针指向下一帧: public GifFrame nextFrame; 这样,解析完成后可以从第一帧开始,第一帧指针第二帧,第二帧指向第三帧.这样一直下去. 我觉得还不如把这些帧存储在一个list里,按顺序加入,按顺序显示就可以了. 于是做了些小改动: image=Bitmap.createBitmap(dest, width, height, Config.ARGB_4444); frame2ArrayList.add(new GifFrame(image, delay));加入到列表中. 而GifFrame也只剩下了bitmap,delay.两个值 了. 建一个存放帧的列表:ArrayList<GifFrame> frame2ArrayList;//存放解析的帧。 如果文件不是太大,解析是没有问题的. 但是内存消耗较大的是setPixels方法.如果把这个方法再优化,就可以解析更大的文件了. 在解析完成后回调view的方法 : @Override public void parseOk(boolean parseStatus, int frameIndex) { Log.d(TAG, "parseOk.frameIndex:"+frameIndex); decodeFinish(parseStatus, frameIndex); } private void decodeFinish(boolean parseStatus, int frameIndex) { if (!parseStatus) { Log.d(TAG, "解析失败。"); if (null!=imageLoadCallback) { imageLoadCallback.loadError(); } return; } if (gifDecoder==null) { /*if (null!=imageLoadCallback) { imageLoadCallback.loadError(); }*/ return; } gifFrames=gifDecoder.getFrameArrayList(); currImageIdx=0; frameLength=gifFrames.size(); //if (rect==null) { mHandler.post(new Runnable() { @Override public void run() { if (null!=imageLoadCallback) { imageLoadCallback.loadFinish(); } Bitmap bitmap=gifFrames.get(0).image; Log.d(TAG, "gif帧间隔为:"+gifFrames.get(0).delay); setShowDimension(bitmap.getWidth(), bitmap.getHeight()); } }); //} gifDecoder.free(); gifDecoder=null; System.gc(); startAnimate(); } private void startAnimate() { Log.d(TAG, "startAnimate.animationType:"+animationType); switch (animationType) { case ANIMATION: Log.d(TAG, "ANIMATION."); if (frameLength>1) { if (drawThread==null) { drawThread=new DrawThread(); } else { drawThread.interrupt(); drawThread=new DrawThread(); } drawThread.start(); } else if (frameLength==1) { reDraw(); } break; } 画图: private class DrawThread extends Thread { @Override public void run() { //Log.d(TAG, "DrawThread.run."); if (gifFrames==null||frameLength<1) { return; } while (isRun) { GifFrame frame=gifFrames.get(currImageIdx++); if (currImageIdx>=frameLength) { currImageIdx=0;//重新播放。 //break; } currentImage=frame.image; if (pause==false) { long delay=frame.delay; //Log.d(TAG, "run.currentImage:"+currentImage+" pause:"+pause+" isRun:"+isRun+" delay:"+delay); Message msg=mHandler.obtainMessage(); mHandler.sendMessage(msg); SystemClock.sleep(delay); } else { SystemClock.sleep(10); break; } } Log.d(TAG, "finish run."); } } 由于view在销毁时没有停止这个DrawThread线程,所以需要设置isRun与pause. public void stopAnimate() { Log.d(TAG, "stopAnimate."); isRun=false; pause=true;} 供外部调用. 这样看上去与原来的解析几乎没有差别,但是后来看到Android文档,说drawbitmap方法,中有一个参数为int[]类型的方法,说是会比较快,然后就修改了解析 的方法,返回的不再是Bitmap了,快了一些.因为生成Bitmap会消耗一些资源,慢一点. 于是setPixels方法修改为: private void setPixels() { try { int[] dest=new int[width*height];//这里申请内存会溢出。 // fill in starting image contents based on last image's dispose code if (lastDispose>0) { if (lastDispose==3) { // use image before last int n=frameCount-2; if (n>0) { lastColors=getColorFrame(n-1); } else { lastColors = null; } } //Log.d(TAG, "lastColors:"+lastColors+" lastDispose:"+lastDispose+" n:"+frameCount); if (lastColors!=null) { //dest=lastColors.colors; System.arraycopy(lastColors.colors, 0, dest, 0, lastColors.colors.length); // copy pixels if (lastDispose==2) { // fill last image rect area with background color int c=0; if (!transparency) { c=lastBgColor; } for (int i=0; i<lrh; i++) { int n1=(lry+i)*width+lrx; int n2=n1+lrw; for (int k=n1; k<n2; k++) { dest[k]=c; } } } } } /*if (dest==null) { dest=new int[width*height]; }*/ // copy each source line to the appropriate place in the destination int pass=1; int inc=8; int iline=0; for (int i=0; i<ih; i++) { int line=i; if (interlace) { if (iline>=ih) { pass++; switch (pass) { case 2: iline=4; break; case 3: iline=2; inc=4; break; case 4: iline=1; inc=2; } } line=iline; iline+=inc; } line+=iy; if (line<height) { int k=line*width; int dx=k+ix; // start of line in dest int dlim=dx+iw; // end of dest line if ((k+width)<dlim) { dlim=k+width; // past dest edge } int sx=i*iw; // start of line in source while (dx<dlim) { // map color and insert in destination int index=((int) pixels[sx++])&0xff; int c=act[index]; if (c!=0) { dest[dx]=c; } dx++; } } } lastColors=new ColorsFrame(dest, delay, width, height, transparency); colorsArr.add(lastColors); } catch (OutOfMemoryError e) { Log.d(TAG, "colorsArr.size():"+colorsArr.size()+"-"+colorsArr.get(0).colors.length); status=STATUS_FINISH; e.printStackTrace(); } } class ColorsFrame { private ColorsFrame(int[] colors, int delay, int width, int height,boolean transparency) { this.colors=colors; this.delay=delay; this.width=width; this.height=height; this.transparency=transparency; } int[] colors; int delay; int width; int height; boolean transparency; 这些属性用于画图的. } 返回的同样是一个列表,但这次不是Bitmap,而是int[] colors; gif解析就是比较耗资源的过程.而且很恶心的是readNetscapeExt这个方法, do { readBlock(); if (block[0]==1) { // loop count sub-block int b1=((int) block[1])&0xff; int b2=((int) block[2])&0xff; loopCount=(b2<<8)|b1; } } while ((blockSize>0)&&!err()); 有时会一直运行,因为while里的条件一直没有达到. 换了以后,gif的解析在内存没有溢出的情况下,会快一些. 然后就是view里的decodeFinish(); gifFrames=gifDecoder2.getFrameArrayList(); currImageIdx=0; frameLength=gifFrames.size(); //if (rect==null) { mHandler.post(new Runnable() { @Override public void run() { if (null!=imageLoadCallback) { imageLoadCallback.loadFinish(); } //Bitmap bitmap=gifFrames.get(0).image; int width=gifFrames.get(0).width; int height=gifFrames.get(0).height; Log.d(TAG, "gif帧间隔为:"+gifFrames.get(0).delay); setShowDimension(width, height); } }); 在onDraw里把它画出来: canvas.drawBitmap(currentImage.colors, 0, currentImage.width, 0, 0, currentImage.width, currentImage.height, currentImage.transparency, null); ===================== 由于Android里面的内存限制,大一些的文件不容易解析(解析的过程优化得不够,本人能力有限,只想到从生成Bitmap到直接使用int[]来画图).所以如果用c++解析再把结果传回来,性能上会好些.看作者的GifFrame,觉得他是从c++中转化来的代码.
完整的代码暂时不放上来了,可以参考原作者的代码,然后如果需要修改为int[]类型的值,传回去播放,最后的效果,可以从本人的微博程序中看到.
应网友要求把全部完整代码放上.但是上面说的进一步处理画图没有包含在内,我认为,如果你想得到一些什么,总是要付出的吧,像散架的汽车就等着组合 了,,code.google上已经上传了,在这里看看自己修改吧.性能影响不会太多
2012.4.17 gif.zip 完整的工程,在/sdcard/中放置test.gif就可以了,
最近又发现一个c写的lib,gif2png,解码部分可以拿出来,由于我对图像处理不熟悉,只能转换部分,虽然读取了整个gif文件,且解码了,但不知道如何将这些rgb值与一些char*等转为需要的像素值。
之前还有一个gifscile这是另外的解码方式,同样解码后不知道如何转为像素值。而且免费,随意使用。
现在把代码放上来,如果会转换的童鞋,可以帮忙弄下,工程里面已经相对完整了。Hello.zip里的jni目录gifread.c是读取gif的文件,/sdcard/test.gif必须
- TestGif.zip (93.1 KB)
- 描述: 修改过的代码,但不是int[]画的图
- 下载次数: 456
- gif.zip (284.2 KB)
- 描述: /sdcard/test.gif必须
- 下载次数: 350
- Hello.zip (340.2 KB)
- 描述: gif2png 解析LWZ
- 下载次数: 259
评论
11 楼
phenom
2015-03-30
PRK 写道
解码过程中,没有显示……
这种方式已经废除了,github上有gifviewer,用jni实现的.效果更好,更快速,直接解析指定帧,但5.0以上系统暂时无法 处理.导致崩溃
10 楼
PRK
2015-03-17
解码过程中,没有显示……
9 楼
tao_jin_sha
2014-06-11
引用
[list] [*] [/list]
8 楼
翔宇天使
2012-09-15
非常感谢楼主
7 楼
phenom
2012-07-16
解析时有透明的选项, 如果是透明的,就只有自定义背景色了.在画图时处理
6 楼
Hugh.sxx
2012-07-16
你好,我有一个问题,如果gif播放的时候,有透明的背景颜色,那么怎么办,显示结果就是黑色的了,请问对着这点怎么进行修改!
5 楼
phenom
2012-03-28
oome暂时没有想到什么办法解决,而且文章里也说到了。
如果解析一帧再放到文件中,再解析下一帧会慢很多,机器好一些就不用太担心内存的问题,i9000解析gif时,较少会出现内存不够用,解析会消耗较多的内存是正常的,gif的标号太多时,会出现问题较常。
其实我一直在想用c来解析,可惜现在都忘了,不熟悉,还有jni,最近在努力学习c,jni这方面的,争取早日解决内存的问题。
上面这段代码后来我在git上看到是一个老外写的,如果原创是他,我觉得googlecode上作者应该注明。
如果解析一帧再放到文件中,再解析下一帧会慢很多,机器好一些就不用太担心内存的问题,i9000解析gif时,较少会出现内存不够用,解析会消耗较多的内存是正常的,gif的标号太多时,会出现问题较常。
其实我一直在想用c来解析,可惜现在都忘了,不熟悉,还有jni,最近在努力学习c,jni这方面的,争取早日解决内存的问题。
上面这段代码后来我在git上看到是一个老外写的,如果原创是他,我觉得googlecode上作者应该注明。
4 楼
717693247
2012-03-27
不好意思,感觉这个submit按钮有问题,提交了三次! 望见谅
3 楼
717693247
2012-03-27
楼主:这篇文章我初略的看了一下,但是好像还是不能解决解析大一点的gif文件文件哦?比如说一个gif的某一帧太大,或者是这个gif的帧太多的话!就有可能会报OOM了!最近我也在看这个GifDecoder,始终都是把每帧都存到了内存中!要是内存中只存一帧,在该显下一帧的时候能从文件中去现读,然后把当前帧recycle()一下,这样的话,应该不会报OOM了,只不过这不一定哈,要是这一帧太大的话,可能还是会报!还有一个问题就是从文件中去现读的话,效率肯定又跟不上了!真的是很难找到一个两全齐美的办法啊!要是楼主你现在有什么好的办法,还望再分享一下!先谢谢了!
最后向楼主您致敬!
最后向楼主您致敬!
2 楼
717693247
2012-03-27
楼主:这篇文章我初略的看了一下,但是好像还是不能解决解析大一点的gif文件文件哦?比如说一个gif的某一帧太大,或者是这个gif的帧太多的话!就有可能会报OOM了!最近我也在看这个GifDecoder,始终都是把每帧都存到了内存中!要是内存中只存一帧,在该显下一帧的时候能从文件中去现读,然后把当前帧recycle()一下,这样的话,应该不会报OOM了,只不过这不一定哈,要是这一帧太大的话,可能还是会报!还有一个问题就是从文件中去现读的话,效率肯定又跟不上了!真的是很难找到一个两全齐美的办法啊!要是楼主你现在有什么好的办法,还望再分享一下!先谢谢了!
最后向楼主您致敬!
最后向楼主您致敬!
1 楼
717693247
2012-03-27
楼主:这篇文章我初略的看了一下,但是好像还是不能解决解析大一点的gif文件文件哦?比如说一个gif的某一帧太大,或者是这个gif的帧太多的话!就有可能会报OOM了!最近我也在看这个GifDecoder,始终都是把每帧都存到了内存中!要是内存中只存一帧,在该显下一帧的时候能从文件中去现读,然后把当前帧recycle()一下,这样的话,应该不会报OOM了,只不过这不一定哈,要是这一帧太大的话,可能还是会报!还有一个问题就是从文件中去现读的话,效率肯定又跟不上了!真的是很难找到一个两全齐美的办法啊!要是楼主你现在有什么好的办法,还望再分享一下!先谢谢了!
最后向楼主您致敬!
最后向楼主您致敬!
发表评论
-
android 批量打渠道包
2014-09-16 17:27 5905打包,是一个经常会遇到的问题,写个脚本就可以解决了.不同的脚本 ... -
vlc for android录制视频与截图
2014-09-08 18:31 8031首先说明,这不算原 ... -
android百度地图转为高德地图
2014-08-11 11:09 2964使用百度地图也不少时间了,但是一直出现无法解决的问题,在官 ... -
编译 i9000的cm系统
2014-08-04 13:10 1596[color=red][b]此文 并不 ... -
mp4v2 保存h264流
2014-05-01 21:15 11827大侠已经完成了很多操作了,唯一不足的是,工程完整性差一些,而且 ... -
baidumap的缩放到看到所有点
2014-04-09 21:03 1464之前使用1.3.5版本的sdk,通过调用mapviewcont ... -
ViewPager 查看图片
2014-02-13 12:59 4525一个图片查看器 , app到处都是 , 但那是别人的. 现在的 ... -
机顶盒 页面 选中后的 动画
2013-12-05 09:39 2184前面已经说过了,对于机顶盒的焦点的处理. 相信有不少人看 ... -
引爆你的图片浏览, ListView 大图片
2013-11-05 07:58 1314之前发现,ListView里面的图片资源越占越大,特别是当 ... -
微博开放源码
2013-10-23 12:09 1035微博程序已经发布不少时间了,但一直也没有很多用户使用,主要在用 ... -
Mupdf 缩小apk包,减少字体
2013-10-20 15:53 3723在以前的apv中,字体占了很大的一部分,如果去除cjk字体 ... -
ActionBar appcompat 解决碎片化问题
2013-09-15 16:58 2178actionbarsherlock 这个在api11以下的系统 ... -
android机顶盒获取有线mac
2013-09-02 16:09 5503直接上代码: public static String ... -
android竖着的seekbar
2013-08-22 20:33 5534以前网上有位虾士发过一篇文章是关于竖着的seekbar,但是也 ... -
新浪微博oauth2.0 自动认证
2013-08-13 09:01 0oauth2.0作者认为它不先进,都放弃了.但是oauth2. ... -
android 颜表情.
2013-07-20 21:16 1858在使用TagsViewGroup 流布局后,我替换了原来的Gr ... -
flow 流布局.
2013-07-13 20:06 1306在git上看到一个FlowingViewGroup,代码有点旧 ... -
开发android机顶盒应用 事件,焦点处理
2013-07-13 19:58 19838机顶盒应用不同于手机 ... -
android 磁盘缓存.
2013-07-13 19:30 5291开发一个app,特别是图片的app,免不了要存储图片,内存缓存 ... -
TextView 文字淡入效果
2013-04-15 13:34 3498一个文本渐渐地从左到右的显示。 几步就可以了实现了。利用的是V ...
相关推荐
这个压缩包文件"安卓Android源码——显示GIF动画源码.zip"提供了实现这一功能的源代码示例。以下是对其中涉及知识点的详细解释: 1. **GIF格式**:GIF是一种流行的图像格式,支持透明度和动画效果。它通过一系列...
通过分析“GifViewDemo”的源码,你可以学习到如何在Android应用中实现GIF动画的显示,以及如何管理和优化相关资源。这将有助于提升你在Android开发中的实践能力,特别是在处理多媒体内容方面。
在提供的信息中,“android gif图片显示view”指的是一个专为Android设计的解决方案,通过JNI(Java Native Interface)技术来实现GIF动画的显示,并且它会生成一个SO(Shared Object)库,使得开发者可以在XML布局...
这个"Android应用源码之android-gif-drawable 支持fig显示的view"是一个针对这一需求的示例项目,适用于毕业设计学习。通过分析这个源码,我们可以深入了解如何在Android应用中有效地展示和控制GIF动图。 首先,`...
本文将详细解析"Android gif 图片浏览器源码"的相关知识点,包括如何自动搜索本地SDCard的GIF图片,以及如何实现图片的预览功能,如上一张、下一张切换。 首先,我们要理解Android对GIF的支持。原生的Android系统并...
本资源“Android 显示GIF动画源码.zip”提供了一种实现方式,可以帮助开发者理解和实现Android应用中播放GIF动画的功能。下面将详细探讨相关知识点。 1. GIF图像格式:GIF(Graphics Interchange Format)是一种...
在Android平台上,开发人员经常需要处理GIF动画的显示,以增强用户体验或提供生动的交互。本示例项目“TestGIFDemo”旨在演示如何在Android应用中播放GIF动画,这主要涉及到以下几个核心知识点: 1. **GIF格式理解*...
本资源包"Android 显示GIF动画源码.zip"提供了一种实现方式来在Android应用中展示GIF动画。以下是对这个源码资源的详细解析和相关知识点的介绍: 1. **GIF格式**:GIF是一种支持透明度和循环播放的动画格式,它由多...
在Android的默认实现中,GIF图片通常被解析为静态图像,无法播放动画。`android-gif-drawable`通过提供一个可绘制对象(Drawable)来解决这个问题,该对象能够处理GIF动画的每一帧,并按时间顺序进行显示。 该库的...
本资源“Android应用源码之android gif模式和图片展现模式 图片展现神器完整版.zip”提供了一个完整的Android应用源码,专门针对Android平台上的GIF动图显示和图片呈现模式进行了深入优化。下面我们将详细探讨其中...
- `Android 显示GIF动画源码`中可能包含了自定义GIF动画View的实现,包括GIF数据的读取、帧的解析、动画的绘制以及时间管理等核心部分。 - 源码可能会使用`GIFDecoder`类来解析GIF文件,获取每帧的图像数据和时间...
这个"Android源码——显示GIF动画源码_new_50.zip"压缩包提供了在Android应用中显示GIF动画的源代码示例。下面我们将深入探讨Android环境下如何加载并播放GIF动画。 首先,Android系统本身并不支持原生地显示GIF...
本项目“Android应用源码之android gif模式和图片展现模式 图片展现神器”提供了一种优化图片显示,特别是GIF动图处理的方法。下面我们将详细探讨相关的知识点。 1. **Android图片加载库**: 在Android中,图片...
本资源“Android程序研发源码Android 显示GIF动画源码.zip”提供了一个名为“GifViewDemo”的示例项目,帮助开发者理解和实现Android环境下GIF动画的显示。 首先,我们要理解Android系统本身并不支持原生显示GIF...
本文将深入探讨`android-gif-drawable`库的源码,揭示其在处理GIF动态图显示时的关键技术和设计思路。 首先,`android-gif-drawable`库的核心类是`GifDrawable`,它继承自`Drawable`,并实现了`Animatable`接口,以...
- Android原生支持GIF图片的显示相对较弱,但在API 24及以上版本,`android.graphics.Movie`类可以解析GIF,并用`View`来播放。对于较低版本,开发者通常依赖第三方库,如 Glide、Picasso 或是专为GIF处理设计的...
本资源“Android高级应用源码-android gif模式和图片展现模式 图片展现神器”提供了关于如何高效、优雅地在Android应用中处理和展示GIF动图以及各种图片模式的实例代码。下面将详细解析其中涉及的关键知识点。 1. *...