根据各位大牛加书总结一下SurfaceView

SurfaceView的作用是用于被动更新的View
① view主要适用于主动更新情况,并且只能在主线程绘制和更新画面。
② surfaceView适用于特别频繁的刷新页面,比如游戏,摄像头,而且通过子线程来进行操作,实现了双缓冲机制

SurfaceView它的绘制原理是绘制前先锁定画布(获取画布),然后等都绘制结束以后在对画布进行解锁 ,最后在把画布内容显示到屏幕上。
Surface有两个接口 :SurfaceHolder.CallBack Runnable
第一个的实现接口方法

//Surface的生命周期
@Override
public void surfaceCreated(SurfaceHolder holder) {

}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

Runnable 直接在run里面写子线程ui操作就行了

初始化

private SurfaceHolder mHolder;  
private Canvas mCanvas;//绘图的画布
private boolean mIsDrawing;//控制绘画线程的标志位

SurfaceHolder里面保存了一个对Surface对象的引用,而我们执行绘制方法本质上就是操控Surface。使用 SurfaceHolder来处理生命周期的初始化。
下面为初始化代码

public MySurfaceView(Context context, AttributeSet attrs) {  
super(context, attrs);
initView();
}

public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}

public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr);
}

private void initView() {
mHolder = getHolder();//获取SurfaceHolder对象
mHolder.addCallback(this);//注册SurfaceHolder的回调方法
setFocusable(true);
setFocusableInTouchMode(true);
this.setKeepScreenOn(true);
}

接下来进行子线程的绘图操作

    @Override  
public void surfaceCreated(SurfaceHolder holder) {
mIsDrawing = true;
new Thread(this).start();
}

@Override
public void surfaceChanged(SurfaceHolder holder,
int format, int width, int height) {
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mIsDrawing = false;
}

@Override
public void run() {
while (mIsDrawing) {
draw();
}
}
//绘图操作
private void draw() {
try {
mCanvas = mHolder.lockCanvas();
// draw sth绘制过程
} catch (Exception e) {
} finally {
if (mCanvas != null)
mHolder.unlockCanvasAndPost(mCanvas);//保证每次都将绘图的内容提交
}
}
}

SurfaceView后面还会用到很多,这里的实例不用多讲
正在搞一个摄像头+surfaceview明天(?)完成