浏览 6977 次
锁定老帖子 主题:*.gif 解码 - 实践
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-02
*.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. 因为描述的比较不细致 所以补上全部代码 供大家分享
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-05-04
终于看到解析gif的东西,以后做动画效果,就简单多了
|
|
返回顶楼 | |
发表时间:2010-05-05
你的线程什么时候结束呢?
|
|
返回顶楼 | |
发表时间:2010-05-05
稻-草 写道 你的线程什么时候结束呢?
结束?不能结束 因为*.gif 是不断循环的 |
|
返回顶楼 | |
发表时间:2010-05-05
那如果控件不用了呢,如弹出个对话框,然后关闭对话框。
|
|
返回顶楼 | |
发表时间:2010-05-05
对咱这种美工差的人是个福音!
|
|
返回顶楼 | |
发表时间:2010-05-09
最后修改: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值的方法是一致的吗? |
|
返回顶楼 | |
发表时间:2010-09-08
你好,要是加载的gif图片背景是透明的,但是最终在模拟器上显示的背景是黑色的是怎么回事,要改动哪个代码呢?
|
|
返回顶楼 | |
发表时间:2011-03-22
我是借助工具获得每帧,然后实现的。觉得还是比较麻烦。
还是代码的比较方便。学习了。 |
|
返回顶楼 | |
发表时间:2011-03-25
Android 自己的 android.graphics.Movie类是支持gif的
具体例子可以看 ApiDemo 里的BitmapDecode例子 |
|
返回顶楼 | |