SurfaceView游戏框架学习笔记

SurfaceView学习笔记整理:

      1.创建MySurfaceView类,继承自SurfaceView,此外还要实现android.view.SurfaceHolder.Callback接口。Callback接口需重写surfaceCreated、surfaceChanged、surfaceDestroyed三个函数用于监听SurfaceView的不同状态。

      2.定义SurfaceHolder类的实例,此类提供控制SurfaceView的大小、格式等,主要用于监听SurfaceView的状态。使用SurfaceHolder的lockCanvas()函数来获取SurfaceView的Canvas对象,再通过在Canvas上绘制内容来修改SurfaceView中的数据。

     lockCanvas()函数不仅获取Canvas还对Canvas画布加锁,画布同步加锁机制主要是为了防止SurfaceView在绘制过程中被修改、摧毁等发生的状况改变;与之对应还有一个unlockCanvasAndPost(Canvas canvas)函数用于解锁画布和提交。

     lockCanvas()可以获取当前视图的画布,lockCanvas(Rect rect)传入一个矩形类的实例,用于得到一个自定义大小的画布。

      3.SurfaceView是通过SurfaceHolder来修改其数据,所以在SurfaceView上绘图不再使用onDraw,而是通过SurfaceHolder获取到SurfaceView的Canvas,然后再绘制。

public myDraw(){

Canvas canvas = holder.lockCanvas();

canvas.drawText("Game",10,10,paint);

holder.unlockCanvasAndPost(canvas);

}

      myDraw()中通过SurfaceHolder的lockCanvas()函数得到一个Canvas实例,然后绘制文本,最后解锁并提交画布。

      4.修改MainActivity,显示自定义的SurfaceView试图。

@Override

public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

//设置全屏

...

//显示自定义的SurfaceView视图

setContentView(new MySurfaceView(this));

}

      5.实现触屏监听

//定义文本的坐标为成员变量

private int textX=10;textY=10;

//修改绘制函数

public void myDraw()

{

 Canvas canvas = holder.lockCanvas();

 canvas.drawText("Game",textX,textY,paint);

 holder.unlockCanvasAndPost(canvas);

}

//完成触屏监听(重写View的触屏监听函数)

@Override

public booblean onTouchEvent(MotionEvent event)

{

  textX=(int)event.getX();

  textY=(int)event.getY();

  myDraw();

  return true;

}

      6.问题:运行程序后,视图中应该只有一个Game文本字样,但是却出现了很多个,问题的原因就是画布没有刷新。