标签:
这里以照相机camera功能的实现来解释surface,surfaceview,sufaceholder以及surface客户端(本例子中指的是camera)的关系,surface及其client(客户端,本例子中指的是camera)之间的纽带就是surfaceholder,它控制着surface及其client(客户端,本例子中指的是camera)之间的连接or断开,surfaceView座位视图层级结构层面的组件,可以认为是它承载了surface,而surface是实际用来接收图像原始像素绘制的缓冲区。
当含有surfaceView的试图层级结构被放到屏幕上时surfaceCreated被调用,此时surfaceholder对surface及其客户端进行关联;
当surfaceView从屏幕上移除时调用surfaceDestroyed方法,也就意味着surface被销毁,surfaceholder断开surface及其客户端的联系;
当surface首次出现在屏幕上调用surfaceChanged方法,通过传入的参数,可以告诉客户端surface的像素格式以及surface的宽度和高度,告知客户端有多大的绘制区域可以使用。
具体的看一下例子:(这里只是截取了有关surface,surfaceview,sufaceholder以及surface客户端(本例子中指的是camera)的部分代码,相机功能的具体实现代码(camera.takePicture(Camera.ShutterCallback shutter,Camera.PictureCallback raw,Camera.PictureCallback jpeg)及其相关接口实现)没有放出来,对于相机功能实现有兴趣或有疑问的盆友可以留下邮箱),代码中的mCamera是一个Camera对象。
1 mSurfaceView=(SurfaceView)view.findViewById(R.id.crime_camera_surface); 2 //surfaceholder 是我们与surface(实际承载图像原始像素的缓冲区)对象联系的纽带 3 //实际上,surfaceholder是作为surface与surface的客户端之间的纽带的,因为要保证surface不存在时没有任何内容要在他上面进行 4 //绘制,所以需要一个“中间人”(surfaceholder)进行协调他们之间的关系。当surface创建完成时,surfaceholder链接客户端与 5 //surface保证他们进行交互,当surface销毁之后,surfaceholder断开surface及其客户端的联系。 6 SurfaceHolder holder=mSurfaceView.getHolder(); 7 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 8 //SurfaceHolder.Callback()用于监听surface的生命周期 9 holder.addCallback(new SurfaceHolder.Callback() { 10 //surfaceView从屏幕上移除时调用此方法,也就意味着surface被销毁,surfaceholder断开surface及其客户端的联系。 11 @Override 12 public void surfaceDestroyed(SurfaceHolder holder) { 13 // TODO Auto-generated method stub 14 if(mCamera!=null){ 15 //surface此时已经被销毁,通过stopPreview方法停止camera在surface上的绘制操作 16 mCamera.stopPreview(); 17 } 18 } 19 //当含有surfaceView的试图层级结构被放到屏幕上时surfaceCreated被调用,此时surfaceholder对surface及其客户端进行关联 20 @Override 21 public void surfaceCreated(SurfaceHolder holder) { 22 // TODO Auto-generated method stub 23 try{ 24 if(mCamera!=null){ 25 //通过setPrevireDisplay链接camera和surface 26 mCamera.setPreviewDisplay(holder); 27 } 28 }catch(IOException e){ 29 Log.e(TAG, "Setting up preview display failed", e); 30 } 31 } 32 //surface首次出现在屏幕上调用这个方法,通过传入的参数,可以告诉客户端surface的像素格式以及surface的宽度和高度, 33 //告知客户端有多大的绘制区域可以使用。 34 @Override 35 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 36 // TODO Auto-generated method stub 37 if(mCamera==null){ 38 return; 39 } 40 Camera.Parameters parameters=mCamera.getParameters(); 41 Size size=getBestSupportedSize(parameters.getSupportedPreviewSizes(), width, height); 42 parameters.setPreviewSize(size.width, size.height); 43 size=getBestSupportedSize(parameters.getSupportedPictureSizes(), width, height); 44 parameters.setPictureSize(size.width, size.height); 45 mCamera.setParameters(parameters); 46 try{ 47 //通过startPreview方法告知可以在surface上进行绘制操作 48 mCamera.startPreview(); 49 }catch(Exception e){ 50 Log.e(TAG, "Start preview failed", e); 51 mCamera.release(); 52 mCamera=null; 53 } 54 } 55 });
android中surface,surfaceview,sufaceholder以及surface客户端的关系
标签:
原文地址:http://www.cnblogs.com/heimianshusheng/p/5020057.html