您的位置:首页 > 移动开发 > Android开发

Android Gif 播放器

2015-10-30 10:53 381 查看

继承SurFaceView类

SurFaceView:SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。具体需要了解可以链接:http://www.cnblogs.com/xuling/archive/2011/06/06/android.html

实现callback接口这样得到三个方法来回调处理

当Surfaceview被创建时执行

[code]public void surfaceCreated(SurfaceHolder holder) { 
    }


Surfaceview发生变化时执行

[code]public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    }


Surfaceview销毁时执行

[code]    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }


完整代码

“`

package com.example.gifplayer;

import java.io.IOException;

import java.io.InputStream;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Movie;

import android.os.Handler;

import android.util.AttributeSet;

import android.view.SurfaceHolder;

import android.view.SurfaceHolder.Callback;

import android.view.SurfaceView;

public class GifView extends SurfaceView implements Callback {

private String gifPath;

[code]public GifView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    initGif();
}

public GifView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initGif();
}

public GifView(Context context) {
    super(context);
    initGif();
}

private SurfaceHolder holder;
private Movie movie;
private Handler handler;
private float zoom = 1;

private Runnable runable = new Runnable() {
    private Canvas canvas;

    public void run() {
        canvas = holder.lockCanvas();
        // 保持当前帧
        canvas.save();
        canvas.scale(zoom, zoom);
        movie.draw(canvas, 0, 0);
        // 设置播放时间
        // 123456789 %6
        // 123450123 循环播放
        movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
        // 不影响其它帧
        canvas.restore();
        // 解锁
        holder.unlockCanvasAndPost(canvas);

        // 定是执行发消息
        handler.postDelayed(runable, 30);
    }
};

/*
 * 设置GIF路径
 */
public void setGif(String gifPath) {
    this.gifPath = gifPath;
}

// 设置放大倍数默认为1倍
public void setZoom(float d) {
    this.zoom = d;
}

/*
 * GIF初始化
 */
public void initGif() {
    holder = getHolder();
    holder.addCallback(this);
    handler = new Handler();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    try {
        InputStream inputStream = getContext().getAssets().open(gifPath);
        movie = Movie.decodeStream(inputStream);
        int width = movie.width();
        int height = movie.height();
        setMeasuredDimension((int) (width * zoom), (int) (height * zoom));
        handler.post(runable);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

@Override
public void surfaceCreated(SurfaceHolder holder) {

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    handler.removeCallbacks(runable);

}


}

这种方式碰到加载比较大的gif的时候会比较慢,小的倒是挺灵活方便的

第一次发博客,也方便自己学习,一起加油吧。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: