私は 2 つのビューを重ね合わせることでそれを行います (以下ではプレビューとオーバーレイという名前を付けます)。1 つはカメラのプレビューを処理し、もう 1 つはキャンバスを制御して、必要なものを描画します。
でres/layout/main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<FrameLayout
android:id="@+id/toplevelframe"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<your.project.Preview
android:id="@+id/preview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<your.project.Overlay
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</FrameLayout>
</LinearLayout>
あなたの活動クラスでは、onCreate()
:
...
setContentView(R.layout.main);
mPreview = (Preview) findViewById(R.id.preview);
mOverlay = (Overlay) findViewById(R.id.overlay);
...
でonResume()
:
...
mCamera = Camera.open();
mPreview.setCamera(mCamera);
...
でonPause()
:
if (mCamera != null) {
mPreview.setCamera(null);
mCamera.release();
mCamera = null;
}
クラスOverlay
は View を拡張し、キャンバスに描画します。特別なことは何もありません。オーバーライドするだけonDraw()
です。
カメラ プレビュー クラス (Preview
以下) については、公式ガイドの例を確認してください。次のようになります。
class Preview extends ViewGroup implements SurfaceHolder.Callback {
...
private SurfaceView mSurfaceView;
private SurfaceHolder mHolder;
private Camera mCamera;
...
public Preview(Context context, AttributeSet aset) {
...
mSurfaceView = new SurfaceView(context);
addView(mSurfaceView);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
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();
}
}
...
}
次に、 SurfaceHolder.Callbackのすべてのメソッドも実装します。