標籤:
這裡以照相機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 @Override12 public void surfaceDestroyed(SurfaceHolder holder) {13 // TODO Auto-generated method stub14 if(mCamera!=null){15 //surface此時已經被銷毀,通過stopPreview方法停止camera在surface上的繪製操作16 mCamera.stopPreview();17 }18 }19 //當含有surfaceView的試圖層級結構被放到螢幕上時surfaceCreated被調用,此時surfaceholder對surface及其用戶端進行關聯20 @Override21 public void surfaceCreated(SurfaceHolder holder) {22 // TODO Auto-generated method stub23 try{24 if(mCamera!=null){25 //通過setPrevireDisplay連結camera和surface26 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 @Override35 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {36 // TODO Auto-generated method stub37 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用戶端的關係