- 浏览: 433528 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
yehuiyan8002:
支持中文查询
快熟查找联系人 -
lehehe:
现成的接口,免费试用,http://www.haoservic ...
天气Widget -
D.Z:
android:focusable="false&q ...
CheckBox在ListView 而导致其OnItemClickListener不会被触发 -
freecode:
碰到该问题,CheckBox的android:focusabl ...
CheckBox在ListView 而导致其OnItemClickListener不会被触发 -
echohfut:
哥们,新博客是不是在墙外啊?不能访问。还有你怎么进行博客迁移的 ...
博客 迁移
*.gif decode 前面已经说过 今天不打算再说了
鉴于自定义组件View 很多人反映看不懂 所以今天想以此为例 再详细演示一遍
主要目标: 定义 TypegifView 用于显示目标*.gif 且 extends View
[代码 步骤]
1. 定义xml所需 属性描述字串 在res\values 新增文件:attra.xml 定义如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TypegifView"> <!-- set *.gif source, as resource id --> <attr name="src" format="integer" /> <!-- set frequency to update bitmap, as int--> <attr name="delta" format="integer" /> </declare-styleable> </resources>
2. 定义TypegifView 构造函数 供*.java调用:
public TypegifView(Context context) { super(context); // TODO Auto-generated constructor stub init(); }
如何使用:
TypegifView tgView = new TypegifView(this);
3. 定义TypegifView 构造函数 供*.xml调用 且根据传入属性描述字串 设置相应函数
public TypegifView(Context context, AttributeSet attrs) { super(context, attrs); init(); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TypegifView); int n = ta.getIndexCount(); for(int i =0;i < n;i++){ int attr = ta.getIndex(i); switch(attr){ case R.styleable.TypegifView_src: int id = ta.getResourceId( R.styleable.TypegifView_src, 0); setSrc(id); case R.styleable.TypegifView_delta: int idelta = ta.getInteger(R.styleable.TypegifView_delta, 1); setDelta(idelta); default: break; } } ta.recycle(); } public void init(){ // do some initial } public void setSrc(int id){ gHelper = new TypegifOpenHelper(); gHelper.read(this.getResources().openRawResource(id)); bmp=gHelper.getFrame(0); Thread updateTimer =new Thread(this); updateTimer.start(); } public void setDelta(int is){ delta = is; }
如何使用:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:gif="http://schemas.android.com/apk/res/org.android.view" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- to introduce gif namespace --> <org.android.view.TypegifView xmlns:gif="http://schemas.android.com/apk/res/org.android.view" android:layout_width="fill_parent" android:layout_height="wrap_content" gif:src="@raw/kitty" gif:delta="10" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="-----------[我是分割线!]-------------" /> </LinearLayout>
4. 属性:src delta 设置:
public void setSrc(int id){ gHelper = new TypegifOpenHelper(); gHelper.read(this.getResources().openRawResource(id)); bmp=gHelper.getFrame(0); Thread updateTimer =new Thread(this); updateTimer.start(); } public void setDelta(int is){ delta = is; }
5. 取得该gif所占用的宽度 高度 如果没有该函数 该组件后面不可以再有别的控件 个人猜测其返回值会是整个屏幕
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); } private int measureWidth(int measureSpec) { return gHelper.getWidth(); } private int measureHeight(int measureSpec) { return gHelper.getHeigh(); }
6. 该View 执行画的回调函数:
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub canvas.drawBitmap(bmp, 0,0,new Paint()); bmp=gHelper.nextBitmap(); }
7. 定义延时Thread 定时更新下一张bitmap
public void run() { // TODO Auto-generated method stub while(true){ try{ this.postInvalidate(); Thread.sleep(gHelper.nextDelay()/delta) ; }catch(Exception ex){ } } }
9. emulator 运行截图:
10. 因为描述的比较不细致 所以补上全部代码 供大家分享
- TypegifTest.rar (336.4 KB)
- 下载次数: 1106
评论
9 楼
nciky1984
2011-03-25
Android 自己的 android.graphics.Movie类是支持gif的
具体例子可以看 ApiDemo 里的BitmapDecode例子
具体例子可以看 ApiDemo 里的BitmapDecode例子
8 楼
15921310063
2011-03-22
我是借助工具获得每帧,然后实现的。觉得还是比较麻烦。
还是代码的比较方便。学习了。
还是代码的比较方便。学习了。
7 楼
热血pk007
2010-09-08
你好,要是加载的gif图片背景是透明的,但是最终在模拟器上显示的背景是黑色的是怎么回事,要改动哪个代码呢?
6 楼
lishali12345
2010-05-09
由于项目中需要使用到GIF解码的东西,刚好在JE上看到,甚感幸福啊
不过我在阅读楼主提供的代码时发现有一个问题,就是readShort()函数的实现
// read 8 bit data
protected int readShort() {
// read 16-bit value, LSB first
return read() | (read() << 8 );
}
这个考虑的是小端字节序存储吗?为何确定就是小端字节序呢,而没有考虑别的方式呢,这个与PC上Java编程时通过二进制流读取来获取short值的方法是一致的吗?
不过我在阅读楼主提供的代码时发现有一个问题,就是readShort()函数的实现
// read 8 bit data
protected int readShort() {
// read 16-bit value, LSB first
return read() | (read() << 8 );
}
这个考虑的是小端字节序存储吗?为何确定就是小端字节序呢,而没有考虑别的方式呢,这个与PC上Java编程时通过二进制流读取来获取short值的方法是一致的吗?
5 楼
yuanliyin
2010-05-05
对咱这种美工差的人是个福音!
4 楼
稻-草
2010-05-05
那如果控件不用了呢,如弹出个对话框,然后关闭对话框。
3 楼
gryphone
2010-05-05
稻-草 写道
你的线程什么时候结束呢?
结束?不能结束 因为*.gif 是不断循环的
2 楼
稻-草
2010-05-05
你的线程什么时候结束呢?
1 楼
mgssnake
2010-05-04
终于看到解析gif的东西,以后做动画效果,就简单多了
发表评论
-
滑动抽屉 另一种解决办法
2010-07-09 17:43 0滑动抽屉 -
Spinner 定制化 增强版
2010-07-09 14:34 2608Spinner 作为下拉选 ... -
ListView 内容之分批显示
2010-06-25 20:38 5923ListView 内容循环显示 大家试想 假如 ... -
MediaScanner 研究
2010-06-23 15:21 3169MediaScanner 之所以拿MediaSc ... -
CheckBox在ListView 而导致其OnItemClickListener不会被触发
2010-06-22 20:55 19013CheckBox在ListView 而导致其OnItemCli ... -
获取Launcher 启动列表
2010-06-22 10:09 3138获取Launcher 启动列表 即 列出所有Launc ... -
PreferenceActivity 全接触
2010-06-19 12:53 9439PreferenceActivity 为了引入 ... -
android src 下载 编译 安装 全接触
2010-06-12 14:44 0android src - download install ... -
Intent.createChooser() 妙用
2010-06-12 11:14 5955Intent.createChooser(ntent targ ... -
SMS管理:收信箱 发信息 编写新信息
2010-06-07 08:14 14443SMS管理 [功能] 1. 收信箱:显示 ... -
求 android 手机 帮忙测试sms服务系统 谢谢
2010-06-05 08:25 1451Hi guys, 最近一段时间没有更新blog 因为一 ... -
流媒体 播放 理论篇
2010-05-28 14:42 2222流媒体播放 之所以为理论篇 因为该篇仅实现了播放功能 ... -
NDK 搭建与HelloWorld
2010-05-19 09:48 3224NDK [前提] 1. Cygwin 用于安装 ... -
自定义字体
2010-05-15 10:49 1220自定义字体: []代码 步骤] 1 ... -
模糊查找 再深入
2010-05-15 09:41 3158模糊查找 再深入 应某位大哥要求 再次对 SQLite ... -
快捷方式Bar + ViewGroup - 自定义
2010-05-09 09:20 2470TabActivity - 自定义 其实 这篇感觉极鸡 ... -
View 拖动&插入 研究
2010-05-09 07:14 3983View 拖动&插入 即: ... -
带图标 快捷键 Menu - 终极版
2010-05-04 20:23 1837Menu 改头换面 扩展如下: 1. 图标化文字 2 ... -
*.gif 解码 - 理论
2010-05-01 21:11 1522我们知道Android 默认是不支持*.gif 的 但是 ... -
shortcut+livefolder
2010-04-19 13:08 1493shortcut+livefolder Live ...
相关推荐
GIF(Graphics Interchange Format)是一种广泛用于网络的图像文件格式,因其支持动画和透明...`GIF_code.zip`提供的资源提供了实现这一过程的基础,对于想要深入理解GIF解码机制的开发者来说,是一个宝贵的实践平台。
这通常涉及到解码图片文件格式,如JPEG、PNG、BMP或GIF等。在Python中,PIL库的Image模块提供了方便的open()函数,可以轻松读取各种格式的图片文件。 4. **GIF文件操作**: GIF是一种支持动画的图片格式,包含多帧...
通过研究这个压缩包中的内容,开发者可以学习到如何在VB中处理GIF图像,理解LZW解码过程,以及如何创建和使用自定义控件。这对于提升VB应用程序的用户体验,特别是涉及到多媒体和动画展示的场景,是非常有价值的。...
在Android平台上,加载GIF动图是一个常见的需求,特别是在创建动态壁纸、消息应用或者社交应用时。本篇文章将深入探讨如何在Android应用中加载和显示GIF...通过研究该项目,你可以更好地理解和实践加载GIF的整个过程。
`GifDecoder`类可以帮助解码Gif,然后通过重写`onDraw()`方法,按照Gif的帧顺序进行绘制。 4. **内存管理和性能优化** 加载Gif会占用大量内存,因此需要关注内存管理。可以使用缓存策略,如LRU缓存,避免内存泄漏...
1. **GIF解码库**: - Android SDK本身并不包含对GIF格式的原生支持,因此我们需要引入第三方库来解析和显示GIF。常见的库有`NineOldAndroids`(用于兼容旧版本的Android)和`Glide`、`Picasso`这样的图片加载库,...
与Android原生的ImageView相比,GifView处理GIF文件更为高效,因为它专门优化了GIF解码和渲染过程。 接下来,我们来看看如何集成GifView到你的项目中: 1. **添加依赖**: 在你的`build.gradle`(Module: app)...
5. **学习与实践** - 通过阅读`JavaApk源码说明.txt`,可以了解代码结构和实现原理,这对理解GIF和帧动画的处理机制非常有帮助。 - `下载更多打包源码~.url`可能指向了其他相关的Android源码资源,可以扩展学习。 ...
总的来说,这些资料提供了从理论到实践的全面视角,涵盖了JPEG和其他图像编码格式的编解码技术,以及它们在各种硬件平台上的实现,包括嵌入式系统和多核处理器架构。通过深入学习这些材料,读者可以掌握数字图像处理...
1. **GIF解析**:GIF文件的解析通常涉及读取GIF的头部信息,获取帧数、帧延迟时间等元数据,并将每一帧的图像数据解码为Bitmap。这通常需要一个GIF解析器库,如NineOldAndroids或者 Glide。 2. **内存管理**:由于...
4. **解码GIF数据**: - GIF采用LZW(Lempel-Ziv-Welch)压缩算法,需要解码才能得到原始像素数据。LZW算法涉及字典构建、编码查找和重建过程。 - 对于多帧的GIF,还需要处理帧间的差异和延时信息。 5. **创建BMP...
通过以上知识点的学习和实践,开发者可以在C++环境中实现GIF图片的播放功能。实际编码过程中,可能还需要结合具体的开发环境和库进行调整。例如,在Windows平台上,可以使用GDI+库,而在跨平台环境下,Qt或SFML等库...
通过分析这些源代码,我们可以学习到如何在程序中实现数据编码和解码,例如读取和写入不同编码的文本文件,或者压缩和解压缩图像或音频数据。这些基本操作在软件开发中至关重要,特别是在跨平台通信和数据交换时。 ...
3. **GIF解码**: - 在Android中,我们可以使用`GifDecoder`类解码GIF文件,它会将GIF数据解析为一系列的图像帧和时间信息。每帧的图像数据可以通过`Bitmap`对象表示,时间信息用于控制动画速度。 4. **动画管理**...
- `javax.imageio`是Java的标准图像I/O库,虽然不直接支持GIF动画,但可以配合其他库,如`ImageIO-Read`,来实现GIF解码。 3. **使用`javax.swing.ImageIcon`**: - 在Swing中,`ImageIcon`类通常用于在GUI组件上...
总之,处理GIF在Android开发中是一个相对复杂的过程,但通过使用合适的库和最佳实践,可以轻松地在应用中集成和播放GIF动画。这个压缩包中的资源为开发者提供了一个起点,帮助他们理解和实现GIF的完美运行。
4. **GIF解码**:GIF是一种流行的动画图像格式,包含多个帧和颜色表。解码GIF涉及到读取头部信息、解析帧数据、处理颜色索引等步骤。这个实验可能使用了开源的GIF解码库,如libgif或TinyGif。 5. **内存管理**:在...
从标签来看,这个项目可能涉及了“另类其它”编程实践,使用了特定的“控件”,并且提供了“源码”供学习和参考,同时也与“资源”管理有关。 在提供的压缩包子文件列表中,我们可以分析每个文件的作用: 1. **...
Android提供了BitmapFactory.Options对象,允许开发者控制图片解码时的大小,以减少内存占用。此外,使用内存缓存和磁盘缓存策略也是防止内存泄漏和提高性能的重要手段。 7. **异步加载**: - 为了保持UI流畅,...
对于GIF,我们需要使用`GifDecoder`或`GifImage`类来解码并逐帧渲染。 - 图片的解码过程需要注意内存管理,避免一次性加载大图导致OOM(Out Of Memory)错误。 4. **多图片展示模式**: - 展示多图片模式可能涉及...