2

サンプルガイドを使用して、SurfaceViewクラスを継承し、カメラプレビューを表示するCameraPreviewというクラスを作成しました。また、Viewから直接継承するDrawOnTopという別のカスタムビュークラスを作成しました。これを使用して、プレビューの上にテキストやその他のアイテムを描画します。各ビュークラスはそれ自体で正常に機能しますが、両方のビューをアクティビティにロードすると、CameraPreviewが常に支配的であり、DrawOnTopクラスのオブジェクトやテキストはカメラプレビューの上に表示されません。

2つのカスタムビュークラスを使用しているため、アクティビティのonCreateでXMLからビュークラスを拡張する必要はありません。そのため、onCreateにはsetContentView(...)の呼び出しが含まれていません。代わりに、各ビュークラスをインスタンス化し、addContentView(...)を使用して各ビューオブジェクトをアクティビティのルートビューにロードします。

CameraPreview preview = new CameraPreview(this); 
addContentView(preview, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

DrawOnTop drawontop = new DrawOnTop(this);       
addContentView(drawontop, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
drawontop.setVisibility(View.VISIBLE);
drawontop.bringToFront();

アクティビティのルートビューを確認したところ、FrameLayoutタイプであることがわかりました。上で述べたように、この方法論は、それ自体で各ビューに対して正常に機能します。

DrawOnTopクラスをカメラプレビューの上部に表示するために、bringToFront()を使用してみましたが、効果がありません。Androidバージョン4.1.1を実行しているSamsungGalaxyNote2LTEでアプリをテストしています。

誰かが私が間違っていることを教えてもらえますか?

4

1 に答える 1

3

このリンクが役立つかもしれません: Android のカメラで使用される SurfaceView にオーバーレイを描画する方法は?

CameraPreview ビューを FrameLayout に配置し、DrawOnTop ビューを FrameLayout と同じレベルにするだけです。

FrameLayout frame = new FrameLayout(this);
addContentView(frame, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
CameraPreview preview = new CameraPreview(this); 
frame.addView(mPreview);

DrawOnTop drawontop = new DrawOnTop(this);       
addContentView(drawontop, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
drawontop.setVisibility(View.VISIBLE);
drawontop.bringToFront();

それはあなたのために働きますか?

于 2013-03-13T20:10:05.717 に答える