Android 解碼播放GIF圖像

Android 播放GIF之前就有過一篇文章是講述如何使用GIF文件並播放。可以通過 這裏 瞭解關於播放GIF的一種方法。

  如果前面有了解過的朋友肯定知道這上面的做法比較麻煩,又要去分解圖片,又要寫各種麻煩的XML文件,有點鬱悶,而且還帶來的直接後果是一個比較多動作的GIF圖片可能會將項目的體積變大,這點很多朋友都無法接受。不過這樣的好處也顯而易見,就是運行的速度會比你去解碼的速度要快。

  以下這種方法是需要解碼,但是速度的話保證不了,可能開線程的時候沒有處理好吧,以下面這張圖片爲例做解碼播放:

  首先,先編寫一個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, 00new 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(R.layout.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();
            }
        });

 

 

顯示效果:


發佈了57 篇原創文章 · 獲贊 33 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章