SurfaceView:
SurfaceView一般会与SurfaceViewHolder(相当于SurfaceView的一个管家)结合使用,SurfaceHolder用于向与之关联的SurfaceView上绘图,SurfaceView.getHolder()。
SurfaceHolder提供了如下方法来获得Canvas对象。
Canvas lockCanvas();锁定S~w对象,获取其canvas。
Canvas lockCanvas(Rect dirty);锁定其上Rect划分的区域,获取其Canvas。
哦对了,,SurfaceHolder一般需要添加一个CallBack来获取SurfaceView的状态,因为SurfaceView什么时候绘制完我们是不知道的,需要他来告诉。
public class GifSurfaceView extends SurfaceView implements Callback {
private SurfaceHolder holder ;
private String path;
private float scale;
/**
* gif 动画绘制的开始坐标
*/
private int x;
private int y ;
Handler mHandler = new Handler();
private Runnable run = new Runnable() {
@Override
public void run() {
Canvas canvas = holder.lockCanvas();
canvas.save();
//进行缩放
canvas.scale(1f/scale, 1f/scale);
movie.draw(canvas, x, y);
canvas.restore();
holder.unlockCanvasAndPost(canvas);
//设置时间:1 2 3 4 5 1 2 3 4 5
movie.setTime((int)(System.currentTimeMillis() % movie.duration()));
mHandler.removeCallbacks(run);
mHandler.postDelayed(run, 20);//让它不停的去画
}
};
private Movie movie;//每一个gif可以看作一个小电影。
public GifSurfaceView(Context context,String path) {
super(context);
holder = getHolder();// 电影的播放器
holder.addCallback(this);
this.path = path;
}
//surfaceView发生噶变
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
}
//surfaceView创建成功了
@Override
public void surfaceCreated(SurfaceHolder arg0) {
initView();
}
/**
* 创建一个gif容器,同时根据容器的宽和高和gif的宽和高进行缩放并且居中
*/
private void initView() {
try {
movie = Movie.decodeStream(getContext().getAssets().open(path));
int width = movie.width();
int height = movie.height();
float scaleX = width / (float)this.getWidth();//1 160/200.0=0
float scaleY = height / (float)this.getHeight();
/**
* 确定我们gif缩放的比列
*
* gif图片 再surfaceView的居中显示
*/
if(scaleX>scaleY){
x = 0 ;
y = (int)((getHeight()*scaleX - height)/2);
scale = scaleX;
}else{
y = 0 ;
x = (int)((getWidth()*scaleY)/2);
scale = scaleY;
}
mHandler.post(run);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
surfaceView销毁了
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
mHandler.removeCallbacks(run);
}
}