ビデオ フィードを開始するためのコードだと思いますが、Camera オブジェクトを取得して開始し、SurfaceView (おそらく SurfaceTexture) に接続します。次のように設定した場合、カメラからのフレームは SurfaceView に直接表示されます。
myHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
myCamera.setPreviewDisplay(myHolder);
これは、カメラ フレームをすばやく簡単に表示する方法ですが、フレームの表示方法を制御することはできません。たとえば、フレームを処理して自分で表示したい場合はonPreviewCallback()
、各フレームのコピーを提供する にサブスクライブする必要があります。上記の 2 つのサーフェス ビュー ラインを省略した場合、フレームは自動的に表示されず、自分で描画できますが、これはかなり遅くなります。https://stackoverflow.com/a/4367250/514531
Canvasを使用して、サーフェスビューの上に描画できます。キャンバスには、形/長方形/線/円/単語などを描画するための多くのメソッドがあります。色/幅などを指定するには Paint オブジェクトを使用します。これが間違っていたら申し訳ありませんが、古い Android を使用していますが、もしそうなら、サーフェスビューを介して表示すると、キャンバスをサーフェスビューにロックできません。https://stackoverflow.com/a/12565208/514531これを回避するために、少し前に OverlayView クラスを作成するコードを見つけました。Android では、ビューを Z 方向に重ねて配置できます。使用しない空の透明なサーフェスビューを使用myHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); myCamera.setPreviewDisplay(myHolder);
すると、canavs をロックして描画を開始できます。
OverlayView クラスは、SurfaceView を拡張した単なるクラスであり、カスタム ディスプレイとして使用されます。これを行うには、次のように、最初のカメラ アクティビティのレイアウト ファイルで宣言する必要があります。
<Your.package.OverlayView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/overView"
/>
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/surfaceView"/>
このレイアウト ファイルR.id.surfaceView
には、カメラで使用する最初の surfaceview があり、おそらくすでに持っているように設定されています。R.id.overView は、描画用のカスタム surfaceview です。
他のビュー コンポーネントと同じように作成できます。
OverLayView overView = (OverlayView)findViewById(R.id.overView);
これも通常のクラスのように機能するため、いくつかのパラメーターを通常どおりに送信し、メソッドを呼び出すことができます。たとえば、私はメソッドを持っています:
overView.setCamera(myCamera, cameraHeight, cameraWidth, getResources(), isFrontCamera);
これで、サーフェスビューに表示するカメラと、描画できる別のサーフェスビューができました。したがって、 TouchEventハンドラーが必要になります。
OverlayView クラスでメソッドをオーバーライドしますonTouchEvent(MotionEvent e)
。MotionEvent は、発生したイベント、タッチのオン/オフを示します。最初にタッチダウン (画面を押す) であることを確認すると、 MotionEvent から X 座標と Y 座標を取得できますe.getX
。
これを canavs と組み合わせて、タッチが発生した場所を描画できます。
注意点: カメラ プレビューのサイズは、おそらくサーフェス ビューのサイズとは異なります。camera オブジェクトからカメラの寸法がわかり、surfaceview のサイズが surfaceView onchange メソッドからわかります。したがって、(viewWidth/touch)*camerawidth のような比率を計算して 2 つを変換する必要があります。
座標を取得したら、必要な場所でカメラ フレームを切り取ることができます。