zoukankan      html  css  js  c++  java
  • Android中surface,surfaceview,sufaceholder以及surface客户端的关系

      这里以照相机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         });
  • 相关阅读:
    第三方登陆微博、qq、微信
    js监测设备类型【安卓,ios,苹果微信,电脑pc】
    前端canvas合并图片两种实现方式
    ios safari input fixed 软键盘里的爱恨情仇
    JS 判断浏览器类型,获取位置信息,让手机震动
    【CLR in c#】参数
    【Clr in c#】方法
    【CRL in c#】常量与字段
    Web Service estful web servicesWCF ServiceServiceStack
    【wpf】Path画扇形以及Path的Data属性的理解
  • 原文地址:https://www.cnblogs.com/heimianshusheng/p/5020057.html
Copyright © 2011-2022 走看看