2014-01-22 3 views
6

Я написал код для работы с пользовательской камерой, и для этого я использую SurfaceView, теперь я хочу знать, что, если мне нужно реализовать функции Zoom IN и OUT, я никогда не работал это приложение.Функция SurfaceView Zoom IN и OUT с использованием пользовательской камеры

Мой код, который я использовал для создания пользовательских камеры, смотрите ниже:

MainActivity.java:-

public class MainActivity extends Activity { 

    private SurfaceView preview=null; 
    private SurfaceHolder previewHolder=null; 
    public Camera camera ;  
    private boolean inPreview=false; 
    ImageButton btnCapture; 


    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);  

      preview=(SurfaceView)findViewById(R.id.surface);  
      previewHolder=preview.getHolder();  
      previewHolder.addCallback(surfaceCallback);  
      previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      previewHolder.setFixedSize(getWindow().getWindowManager()  
        .getDefaultDisplay().getWidth(), getWindow().getWindowManager() 
        .getDefaultDisplay().getHeight()); 

     btnCapture = (ImageButton) findViewById(R.id.btnCapture); 

     btnCapture.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      Toast.makeText(getApplicationContext(), "Capture Image(s)", Toast.LENGTH_LONG).show();   
      } 
     }); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     camera=Camera.open(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (inPreview) { 
      camera.stopPreview(); } 
     camera.release(); 
     camera=null; 
     inPreview=false;   
    } 


    private Camera.Size getBestPreviewSize(int width, int height,Camera.Parameters parameters){ 
     Camera.Size result=null; 
     for (Camera.Size size : parameters.getSupportedPreviewSizes()) 
     { 
      if (size.width<=width && size.height<=height) 
      { 
       if (result==null) { 
        result=size; 
       } else { 
        int resultArea=result.width*result.height; 
        int newArea=size.width*size.height; 
        if (newArea>resultArea) { 
         result=size; 
        } 
       } 
      } 
     } 
     return(result); 
    } 

    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback(){ 

     public void surfaceCreated(SurfaceHolder holder) {  
      try {   
       camera.setPreviewDisplay(previewHolder); 
      } catch (Throwable t) { 
       Log.e("PreviewDemo-surfaceCallback", 
        "Exception in setPreviewDisplay()", t); 
       Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_LONG).show();  
      }  
     }  

     public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) { 
      Camera.Parameters parameters=camera.getParameters();  
      Camera.Size size=getBestPreviewSize(width, height,           
        parameters);  
      if (size!=null) {  
       parameters.setPreviewSize(size.width, size.height); 
       camera.setParameters(parameters);  
       camera.startPreview();  
       inPreview=true;  
      }  
     } 

     public void surfaceDestroyed(SurfaceHolder holder) { 

     } 
    };  
} 

activity_main.xml: -

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/splash_background" > 

    <android.view.SurfaceView 
     android:id="@+id/surface" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <ImageButton 
     android:id="@+id/btnCapture" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:background="@drawable/capture" 
     android:contentDescription="@string/app_name" /> 

    </RelativeLayout> 

ответ

4

Ниже приведен пример кода для функции масштабирования. Пожалуйста, попробуйте, если это может вам помочь:

public class DemoActivity extends Activity { 

private FrameLayout pCameraLayout = null; // this layout contains surfaceview 
private ZoomControls zoomControls ; 
Camera mCamera=null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     enableZoom(); 
    } 

    private void enableZoom() { 
     zoomControls = new ZoomControls(this); 
     zoomControls.setIsZoomInEnabled(true); 
     zoomControls.setIsZoomOutEnabled(true); 
     zoomControls.setOnZoomInClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       zoomCamera(false); 

      } 
     }); 
     zoomControls.setOnZoomOutClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       zoomCamera(true); 
      } 
     }); 
     pCameraLayout.addView(zoomControls); 
    } 

    /** 
    * Enables zoom feature in native camera . Called from listener of the view 
    * used for zoom in and zoom out. 
    * 
    * 
    * @param zoomInOrOut "false" for zoom in and "true" for zoom out 
    */ 
    public void zoomCamera(boolean zoomInOrOut) { 
     if(mCamera!=null) { 
      Parameters parameter = mCamera.getParameters(); 

      if(parameter.isZoomSupported()) { 
       int MAX_ZOOM = parameter.getMaxZoom(); 
       int currnetZoom = parameter.getZoom(); 
        if(zoomInOrOut && (currnetZoom <MAX_ZOOM && currnetZoom >=0)) { 
         parameter.setZoom(++currnetZoom); 
        } 
        else if(!zoomInOrOut && (currnetZoom <=MAX_ZOOM && currnetZoom >0)) { 
        parameter.setZoom(--currnetZoom); 
        } 
      } 
      else 
       Toast.makeText(context, "Zoom Not Avaliable", Toast.LENGTH_LONG).show(); 

      mCamera.setParameters(parameter); 
     } 
    } 
6

Я нашел способ, используя несколько ссылок, это работает для меня, и, наконец, я добавил код в мой surfaceChanged (...), мой полный surfaceChanged (..) код выглядит , ниже:

объявить переменную ИНТ типа данных с именем currentZoomLevel и назначить в качестве начального значения,

int currentZoomLevel = 0; 

Код: -

public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) { 
      params = camera.getParameters();  
      params.setFlashMode(Camera.Parameters.FLASH_MODE_ON); 
      Camera.Size size=getBestPreviewSize(width, height,           
        params);  
      if (size!=null) {  
       params.setPreviewSize(size.width, size.height); 
       camera.setParameters(params);  
       camera.startPreview();  
       inPreview=true; 
       ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomControls); 

       if (params.isZoomSupported()) { 
        final int maxZoomLevel = params.getMaxZoom(); 
        Log.i("max ZOOM ", "is " + maxZoomLevel); 
        zoomControls.setIsZoomInEnabled(true); 
        zoomControls.setIsZoomOutEnabled(true); 

        zoomControls.setOnZoomInClickListener(new OnClickListener(){ 
         public void onClick(View v){ 
          if(currentZoomLevel < maxZoomLevel){ 
           currentZoomLevel++; 
           //mCamera.startSmoothZoom(currentZoomLevel); 
           params.setZoom(currentZoomLevel); 
           camera.setParameters(params); 
          } 
         } 
        }); 

        zoomControls.setOnZoomOutClickListener(new OnClickListener(){ 
         public void onClick(View v){ 
          if(currentZoomLevel > 0){ 
           currentZoomLevel--; 
           params.setZoom(currentZoomLevel); 
           camera.setParameters(params); 
          } 
         } 
        });  
       } 
       else 
        zoomControls.setVisibility(View.GONE); 
       }  
      } 

Xml: -

<ZoomControls 
    android:id="@+id/zoomControls" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" /> 

Я помещаю мой ответ, только для более clearity и для зрителей будущего использования ..

+0

plus одна форма мой сторона !! действительно спас мое время ... – Radhey

Смежные вопросы