4

私のアプリケーションでは、カスタム SurfaceView を使用してカメラから画像を取得し、キャンバスを使用して追加の機能を描画した後、画面に印刷するためのカスタム ビューを使用していました。次の 2 つのクラスが作成され、アクティビティのレイアウトに追加されました。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myView = new MyView(this);
    mySurfaceView = new MySurfaceView(this, myView);

    setContentView(mySurfaceView);
    addContentView(myView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}

そして、myView は、surfaceChanged メソッドと surfaceCreated メソッドを使用して mySurfaceView からコールバックされました。

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    Camera.Parameters parameters = mCamera.getParameters();

    ...

    mCamera.setParameters(parameters);
    mCamera.startPreview();
}
public void surfaceCreated(SurfaceHolder holder) {
    mCamera = Camera.open();
    try{
        mCamera.setPreviewDisplay(holder);
        mCamera.setPreviewCallback(new Camera.PreviewCallback() {
            public void onPreviewFrame(byte[] data, Camera camera) {

                ...

                System.arraycopy(data, 0, myView.cameraData, 0, data.length);
                myView.invalidate();
            }
        });
    }catch(Exception e){
        mCamera.release();
        mCamera = null;
    }
}

すべてが正常に機能していました...同じアプリで2つの異なるビューを使用するために、上記のすべてをフラグメントに入れることにしました。チュートリアルに従って、Activity ではなく Fragment に 2 つのクラスを配置しました。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    myView = new MyView(this);
    mySurfaceView = new MySurfaceView(this, myView);       
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    mySurfaceView = (MySurfaceView)inflater.inflate(R.layout.camera_view, null);

    return mySurfaceView;
}

一方、XML レイアウトは次のとおりです:
camera_fragment (他のフラグメントについてはまだ気にしていません):

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!-- "Fragment A" -->

    <fragment
        android:id="@+id/camera_frag"
        android:name="com.example.mypackage.CameraFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

カメラビュー:

<?xml version="1.0" encoding="utf-8"?>
<view xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.example.mypackage.MySurfaceView" >

</view>

コードのフラグメント バージョンを使用すると、SurfaceView を簡単に表示できますが、View によって描画される機能を画面に表示できないようです。エラー コードは報告されていませんが、プログラムは setPreviewCallback に入らず、次に onPreviewFrame メソッドに入っていないようです。クラスをインスタンス化する方法、レイアウトを宣言する方法、またはその両方が原因であるかどうかはわかりません。

4

0 に答える 0