Android : 사용자 정의 카메라 미리보기 위젯을 만드는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/951121

  •  11-09-2019
  •  | 
  •  

문제

카메라 미리보기 용 사용자 정의 위젯을 개발하려고합니다. 카메라 미리보기로 화면을 채우고 버튼을 그 위에 그려고 싶습니다.

다음과 같은 방법으로 사용자 정의 위젯을 만들려고했습니다.

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

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

CapturePreview(Context context) {
    super(context);
    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    mCamera = Camera.open();
    try {
       mCamera.setPreviewDisplay(holder);
    } catch (IOException exception) {
        mCamera.release();
        mCamera = null;
        // TODO: add more exception handling logic here
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    mCamera.stopPreview();
    mCamera = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    Camera.Parameters parameters = mCamera.getParameters();
    parameters.setPreviewSize(w, h);
    mCamera.setParameters(parameters);
    mCamera.startPreview();
}

}

다음과 같은 방법으로 main.xml 파일을 수정했습니다.

<RelativeLayout android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout">
<dev.video.client.CapturePreview android:id="@+id/capturePreview" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</RelativeLayout>

활동 클래스에서 나는 위젯을 다음과 같은 방식으로 바인딩하려고 시도했습니다.

private CapturePreview mPreview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setFullscreen();

    setContentView(R.layout.main);

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    //mPreview = new CapturePreview(this);
    //setContentView(mPreview);

    mPreview = (CapturePreview)this.findViewById(R.id.capturePreview);
}

응용 프로그램을 디버깅하려고 할 때마다 오류 메시지가 표시되며 무엇이 잘못 될 수 있는지 알지 못했습니다.

이 문제에 대한 도움에 감사드립니다.

감사!

도움이 되었습니까?

해결책

이 작업을 위해 SurfaceView에서 다음 생성자를 작성해야합니다.

CapturePreview(Context context, AttributeSet attrs)

아시다시피, Java의 생성자는 슈퍼 클래스에서 상속되지 않지만 XML 파일에서 해당 구성 요소를 사용할 때 (GUI를 프로그래밍 방식으로 정의하는 것과 반대로) Android가 호출하려고 시도하는 생성자입니다. 물론 그것은 작동하지 않으므로 오류 메시지는 훨씬 더 명확합니다. 제 생각에는 훨씬 더 명확해야합니다.

그만큼 속성 세트 XML 선언에 언급 된 모든 속성이 포함되어 있으므로 구성 요소에 대한 사용자 지정 속성이있는 경우 생성자에서 검색하고 조치를 취할 수 있습니다.

다른 팁

존경받는보기에 OntouchListener ()를 구현할 수 있습니다. SURFARE를 클릭하면 자동으로 Android 시스템이 OnTouchListener () 메소드로 이동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top