私のアプリケーションでは、カスタム 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 メソッドに入っていないようです。クラスをインスタンス化する方法、レイアウトを宣言する方法、またはその両方が原因であるかどうかはわかりません。