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文本字样,但是却出现了很多个,问题的原因就是画布没有刷新。