2017-03-09 12 views
3

이것은 내 미리보기 클래스로 여러 장치에서 완벽하게 작동하지만 안드로이드 삼성 갤럭시 S4는 저의 나쁜 결과를 보여줍니다. 미리보기 이미지가 늘어납니다.안드로이드의 멀티 스크린 지원 : 삼성 갤럭시 s4 미니 이슈에서 카메라 미리보기가 늘어납니다.

당신은 아래 이미지를 볼 수 있습니다

class Preview extends ViewGroup implements SurfaceHolder.Callback { 
private final String TAG = "Preview"; 
SurfaceView mSurfaceView; 
SurfaceHolder mHolder; 
Camera.Size mPreviewSize; 
List<Camera.Size> mSupportedPreviewSizes; 
Camera mCamera; 

Preview(Context context, SurfaceView sv) { 
    super(context); 
    mSurfaceView = sv; 
    mHolder = mSurfaceView.getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void setCamera(Camera camera) { 
    mCamera = camera; 
    if (mCamera != null) { 
     mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 

     requestLayout(); 

     // get Camera parameters 
     Camera.Parameters params = mCamera.getParameters(); 

     List<String> focusModes = params.getSupportedFocusModes(); 



     try { 
        if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { 
         params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 

        } else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { 
         params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
        } 
        else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY)) { 
         params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); 
        } 
      mCamera.setParameters(params); 
       } 
       catch (Exception e) { 
       } 
    } 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    // We purposely disregard child measurements because act as a 
    // wrapper to a SurfaceView that centers the camera preview instead 
    // of stretching it. 
    final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
    final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); 
    setMeasuredDimension(width, height); 

    if (mSupportedPreviewSizes != null) { 
     mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); 
    } 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    if (changed && getChildCount() > 0) { 
     final View child = getChildAt(0); 

     final int width = r - l; 
     final int height = b - t; 

     int previewWidth = width; 
     int previewHeight = height; 
     if (mPreviewSize != null) { 
      previewWidth = mPreviewSize.width; 
      previewHeight = mPreviewSize.height; 
     } 

     // Center the child SurfaceView within the parent. 
     if (width * previewHeight > height * previewWidth) { 
      final int scaledChildWidth = previewWidth * height/previewHeight; 
      child.layout((width - scaledChildWidth)/2, 0, 
        (width + scaledChildWidth)/2, height); 
     } else { 
      final int scaledChildHeight = previewHeight * width/previewWidth; 
      child.layout(0, (height - scaledChildHeight)/2, 
        width, (height + scaledChildHeight)/2); 
     } 
    } 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, acquire the camera and tell it where 
    // to draw. 
    try { 
     if (mCamera != null) { 
      mCamera.setPreviewDisplay(holder); 
     } 
    } catch (IOException exception) { 
     Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // Surface will be destroyed when we return, so stop the preview. 
    if (mCamera != null) { 
     mCamera.stopPreview(); 
    } 
} 


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

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

    int targetHeight = h; 

    // Try to find an size match aspect ratio and size 
    for (Camera.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 (Camera.Size size : sizes) { 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
    } 
    return optimalSize; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    if(mCamera != null) { 
     if (mPreviewSize!=null){ 
      Camera.Parameters parameters = mCamera.getParameters(); 

      parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
      requestLayout(); 

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

    } 
} 

} 

내가 미리보기 후 안드로이드에서 이미지 지원 멀티 스크린을 유지하려면 :

enter image description here

가 여기 내 코드입니다.

+0

심지어 내가 같은 결과가 0.0 ASPECT_TOLERANCE 변경으로 0.0 – Ibrahim

+0

에'ASPECT_TOLERANCE'을 변경하려고주세요! – Nawrez

답변

1

이미지 또는 미리보기가 늘어나지 않게하려면 휴대 전화 화면과 동일한 비율로 유지되는 미리보기 크기를 선택해야합니다. 그런 다음 카메라를 시작하고 시작하기 전에 설정해야합니다. 이 코드를보십시오 :

public void setCamera(Camera camera, int screenW, int screenH) { 

    //screenW ==> screen width of the phone in Pixels 
    //screenH ==> screen height of the phone in Pixels 

    mCamera = camera; 
    if (mCamera != null) { 
     mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
     if (mSupportedPreviewSizes != null) { 
      mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, screenW 
        , screenH); 
     } 
     requestLayout(); 

     // get Camera parameters 
     Camera.Parameters params = mCamera.getParameters(); 

     if (mPreviewSize != null) 
      params.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 

     List<String> focusModes = params.getSupportedFocusModes(); 


     try { 
      if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { 
       params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 

      } else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { 
       params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
      } else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY)) { 
       params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); 
      } 
      mCamera.setParameters(params); 

      Log.i(TAG, " getPreviewSize " + mCamera.getParameters().getPreviewSize().width + " X " 
        + mCamera.getParameters().getPreviewSize().height); 

      Log.i(TAG, " getPictureSize " + mCamera.getParameters().getPictureSize().width + " X " 
        + mCamera.getParameters().getPictureSize().height); 

     } catch (Exception e) { 
     } 
    } 
} 
+0

Yess, 고마워, 제게는 효과가 있습니다 !! – Nawrez