1

私は本当に自分の仕事に行き詰まっています。私はstackoverflowで多くの質問と回答を読みましたが、それでも自分に合った正確な回答を見つけることができません. 私を助けてください、または正しい方向に向けてください...

カメラの使用中に画面上のオブジェクトを選択できるアプリケーションを作成しようとしています。

もっと簡単に説明しようと思います。アプリケーションをオンにすると、カメラのライブ画面が何かを記録しているかのように表示されます。指を使って、画面上の 3 つの特定のポイントを選択します (これらは、以前に用意した小さなカラー ペーパーの四角形です)。私の選択は電話に保存されます。(次に何が起こるかについてのこれ以上の説明はここでは重要ではないと思うので、ここでやめておきます)。

画面上のそれらのポイントを選択できるようにするプログラム/コードの作成方法がわかりません。私が今持っているのは、カメラをオンにしてビデオを録画できるようにするだけの簡単なコードだけです。

助けてください。

4

1 に答える 1

1

ビデオ フィードを開始するためのコードだと思いますが、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 つを変換する必要があります。

座標を取得したら、必要な場所でカメラ フレームを切り取ることができます。

于 2013-11-06T08:51:26.097 に答える