• 工作总结
  • 工作计划
  • 心得体会
  • 述职报告
  • 思想汇报
  • 发言讲话稿
  • 演讲稿
  • 申请书
  • 读后感
  • 报告材料
  • 策划方案
  • 当前位置: 写作资料库 > 其他范文 > 正文

    Android,平台实现Gif,图像解码并播放代码及组件|码书的大小对图像编码、解码的影响

    时间:2018-08-15 16:26:28 来源:写作资料库 本文已影响 写作资料库手机站

    Android 播放GIF之前就有过一篇文章是讲述如何使用GIF文件并播放。可以通过 这里 了解关于播放GIF的一种方法。

    如果前面有了解过的朋友肯定知道这上面的做法比较麻烦,又要去分解图片,又要写各种麻烦的XML文件,有点郁闷,而且还带来的直接后果是一个比较多动作的GIF图片可能会将项目的体积变大,这点很多朋友都无法接受。不过这样的好处也显而易见,就是运行的速度会比你去解码的速度要快。

    以下这种方法是需要解码,但是速度的话保证不了,可能开线程的时候没有处理好吧,以下面这张图片为例做解码播放:

    Android 平台实现Gif 图像解码并播放代码及组件1

    首先,先编写一个GIF解码的帮助类,该类提供了几个操作GIF图片的方法,比如图片的初始化呀,切换图片呀,获得整个GIF的组合数量等等,由于代码量太多,这里就不列出来,后面会提供源码供大家参考,可于源码内找到该帮助类。

    之后,编写一个用于可显示Gif 的组件,继承自View 并实现了Runable,代码如下:

    package com.terry.gif;

    import android.content.Context;

    import android.content.res.TypedArray;

    import android.graphics.Bitmap;

    import android.graphics.Canvas;

    import android.graphics.Paint;

    import android.util.AttributeSet;

    import android.view.View;

    public class TypegifView extends View implements Runnable {

    gifOpenHelper gHelper;

    private boolean isStop = true;

    int delta;

    String title;

    Bitmap bmp;

    // construct - refer for java

    public TypegifView(Context context) {

    this(context, null);

    }

    // construct - refer for xml

    public TypegifView(Context context, AttributeSet attrs) {

    super(context, attrs);

    //添加属性

    TypedArray ta = context.obtainStyledAttributes(attrs,

    R.styleable.gifView);

    int n = ta.getIndexCount();

    for (int i = 0; i < n; i++) {

    int attr = ta.getIndex(i);

    switch (attr) {

    case R.styleable.gifView_src:

    int id = ta.getResourceId(R.styleable.gifView_src, 0);

    setSrc(id);

    break;

    case R.styleable.gifView_delay:

    int idelta = ta.getInteger(R.styleable.gifView_delay, 1);

    setDelta(idelta);

    break;

    case R.styleable.gifView_stop:

    boolean sp = ta.getBoolean(R.styleable.gifView_stop, false);

    if (!sp) {

    setStop();

    }

    break;

    }

    }

    ta.recycle();

    }

    /**

    * 设置停止

    *

    * @param stop

    */

    public void setStop() {

    isStop = false;

    }

    /**

    * 设置启动

    */

    public void setStart() {

    isStop = true;

    Thread updateTimer = new Thread(this);

    updateTimer.start();

    }

    /**

    * 通过下票设置第几张图片显示

    * @param id

    */

    public void setSrc(int id) {

    gHelper = new gifOpenHelper();

    gHelper.read(TypegifView.this.getResources().openRawResource(id));

    bmp = gHelper.getImage();// 得到第一张图片

    }

    public void setDelta(int is) {

    delta = is;

    }

    // to meaure its Width & Height

    @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();

    }

    protected void onDraw(Canvas canvas) {

    // TODO Auto-generated method stub

    canvas.drawBitmap(bmp, 0, 0, new Paint());

    bmp = gHelper.nextBitmap();

    }

    public void run() {

    // TODO Auto-generated method stub

    while (isStop) {

    try {

    this.postInvalidate();

    Thread.sleep(gHelper.nextDelay() / delta);

    } catch (Exception ex) {

    }

    }

    }

    }

    基础功能实现后。可通过view.start()开启GIF的播放,或者view.stop()停止GIF的播放,代码如下:

    setContentView(yout.main);

    Button btn = (Button) findViewById(R.id.Button01);

    Button btn2 = (Button) findViewById(R.id.Button02);

    final TypegifView view = (TypegifView) findViewById(R.id.gifView1);

    btn.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

    view.setStop();

    }

    });

    btn2.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

    view.setStart();

    }

    });

    显示效果:

    Android 平台实现Gif 图像解码并播放代码及组件2