2014-10-01 1 views
0

바로 지금, 나는 surfaceview에서 카메라를 사용해야하는 샘플 앱을 만들고 있습니다. 성공적으로 surfaceview에서 카메라를 설정했지만 정상적인 카메라보기를 얻을 수 없어 폭과 높이가 변경됩니다. 아래는 제 코드입니다. 나는 누구로부터 아이디어를 얻게되어 기쁩니다.Surfaceview android에서 일반적인 카메라보기를 얻는 방법?

Camera 클래스 :

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera); 
      cameraObject = isCameraAvailiable(); 
    showCamera = new ShowCamera(this, cameraObject); 
    preview.addView(showCamera); 
      takePhotoButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
     cameraObject.takePicture(null, null, capturedIt); 
     cameraObject.stopPreview(); 
     preview.removeView(showCamera); 
     cameraObject.release(); 
     cameraObject = Camera.open(); 
     showCamera = new ShowCamera(Photo.this, cameraObject); 

     preview.addView(showCamera); 
     } 
    }); 
} 

SurfaceHolder에 클래스 :

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback { 

private SurfaceHolder holdMe; 
private Camera theCamera; 

public ShowCamera(Context context, Camera camera) { 
    super(context); 
    theCamera = camera; 
    holdMe = getHolder(); 
    holdMe.addCallback(this); 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    theCamera.stopPreview(); 
    theCamera.setDisplayOrientation(90); 
    camWidth = width; 
    camHeight = height; 
    theCamera.startPreview(); 
    initPreview(width, height); 
} 

private void initPreview(int width, int height) { 
    // Log.i(TAG, "initPreview()starts"); 

    if (theCamera != null) { 
     try { 
      Camera.Parameters param; 
      param = camera.getParameters(); 
      param.setPreviewSize(176, 144); 
      camera.setParameters(param); 
      theCamera.setPreviewDisplay(holdMe); 
     } catch (Throwable t) { 
      Log.e("PreviewDemo-surfaceCallback", 
        "Exception in setPreviewDisplay()", t); 
     } 
    } 

    // Log.i(TAG, "initPreview() ends"); 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     theCamera.setDisplayOrientation(90); 
     theCamera.setPreviewDisplay(holdme); 
     theCamera.startPreview(); 
    } catch (IOException e) { 
    } 
} 

public void surfaceDestroyed(SurfaceHolder arg0) { 
    this.getHolder().removeCallback(this); 
    theCamera.stopPreview(); 
    theCamera.release(); 
} 

}

Framelayout.xml

<FrameLayout 
    android:id="@+id/preview1" 
    android:layout_width="match_parent" 
    android:layout_height="200dp" 
    android:layout_alignParentLeft="true"> 

</FrameLayout> 

enter image description here

+0

의 레이아웃 매개 변수를 설정 ** 클래스는있다 회원 ** 미리보기 **. 어떻게 정의되고 초기화됩니까? –

+0

위 코드는 위의 코드에서 볼 수 있습니다. – Vicky

+0

아니요,'preview.addView()'또는'preview.removeView()'와 같은 명령문 만 볼 수 있지만'preview - new Preview (width, height);'와 같은 명령문은 볼 수 없습니다. –

답변

0

왜곡없이 카메라를 표시하려면 미리보기 프레임의 경우 layout_height을 무시해야합니다. 카메라는 176x144 미리보기 크기를 지원하는지 알고, 이것은 당신이 정말로 사용하고 싶은 경우, 단순히 ** 카메라에서 미리보기,

showCamera = new ShowCamera(this, cameraObject); 

ViewGroup.LayoutParams lp = preview.getLayoutParams(); 
lp.width = getWindowManager().getDefaultDisplay().getWidth(); 
//*** no, this is wrong!! *** lp.height = lp.width*144/176; 
lp.height = lp.width*176/144; // that's correct for Camera.setDisplayOrientation(90) !! 
preview.setLayoutParams(lp); 

preview.addView(showCamera); 
+0

너비와 높이를 설정하면 위의 해결 방법을 따라 갔지만 동일하게 유지됩니다. – Vicky

+0

카메라의 높이를 200dp로 설정하면 스트리트 이미지가 어떻게 표시됩니까? – Vicky

+0

'addView (showCamera) '를 호출하기 전에 미리보기 레이아웃을 변경해야합니다. 그러나 다른 화면 크기에 신경 쓰지 않는다면 화면 너비 * 144/176을 계산하고 이것을 XML의 layout_height로 설정하면됩니다. ** dx **가 아닌 ** px **를 사용하거나 관련 배율 인수를 사용해야합니다. 스크린 샷이 1 : 1이고 화면 너비가 실제로 ** 200px ** 인 경우 높이를 ** 163px ** –