android中surface,surfaceview,sufaceholder以及surface用戶端的關係

來源:互聯網
上載者:User

標籤:

  這裡以照相機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用戶端的關係

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.