继承SurFaceView类
SurFaceView:SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。具体需要了解可以链接:http://www.cnblogs.com/xuling/archive/2011/06/06/android.html
实现callback接口这样得到三个方法来回调处理
当Surfaceview被创建时执行
public void surfaceCreated(SurfaceHolder holder) {
}
Surfaceview发生变化时执行
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
Surfaceview销毁时执行
@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;
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的时候会比较慢,小的倒是挺灵活方便的
第一次发博客,也方便自己学习,一起加油吧。。。