본문 바로가기

Programing/Android

surfaceview

public class Preview extends SurfaceView implements SurfaceHolder.Callback {
 SurfaceHolder mHolder;
 Camera mCamera;

 public Preview(Context context) {
  super(context);
  // TODO Auto-generated constructor stub
  mHolder = getHolder();
  mHolder.addCallback(this);
  mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  // TODO Auto-generated method stub
  /*
   Camera.Parameters parameters = mCamera.getParameters();
      parameters.setPreviewSize(w, h);
      mCamera.setParameters(parameters);
      mCamera.startPreview();
      */
  Camera.Parameters parameters = mCamera.getParameters();


        List<Size> sizes = parameters.getSupportedPreviewSizes();
  Size optimalSize = getOptimalPreviewSize(sizes, w, h);
  Log.d("DEBUG", optimalSize.width + "," + optimalSize.height);
  parameters.setPreviewSize(optimalSize.width, optimalSize.height);


  mCamera.setParameters(parameters);
  mCamera.startPreview();

  
 }
 
 private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
        final double ASPECT_TOLERANCE = 0.1;
        double targetRatio = (double) w / h;
        if (sizes == null) return null;


        Size optimalSize = null;
        double minDiff = Double.MAX_VALUE;


        int targetHeight = h;

        // Try to find an size match aspect ratio and size
        for (Size size : sizes) {
            double ratio = (double) size.width / size.height;
            if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }


        // Cannot find the one match the aspect ratio, ignore the requirement
        if (optimalSize == null) {
            minDiff = Double.MAX_VALUE;
            for (Size size : sizes) {
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
        }
        return optimalSize;
    }


 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
     mCamera = Camera.open();
     mCamera.setDisplayOrientation(90);
    
         try {
            mCamera.setPreviewDisplay(holder);

         } catch (IOException exception) {
             mCamera.release();
             mCamera = null;
             // TODO: add more exception handling logic here
         }
  
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  mCamera.stopPreview();
  mCamera.release();
        mCamera = null;
 }


}