SurfaceView 阶段总结
原创
©著作权归作者所有:来自51CTO博客作者RikkaTheWorld的原创作品,请联系作者获取转载授权,否则将追究法律责任
根据各位大牛加书总结一下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明天(?)完成