3

私は現在、写真の撮影とビデオの録画の両方にデバイスのカメラを使用する Android アプリケーションを開発しています。このアプリケーションは、API レベル >= 8 (Froyo) で動作する必要があります。

これまで、Android のサンプルに基づいてカメラ コードを実装してきました。それはで見つけることができます<ADT folder>/sdk/samples/<android_version>/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java-私は「android 11」の例に従ってカメラを切り替え、残りは「android 8」に切り替えます。これは、カメラ プレビューがSurfaceViewViewGroup(CameraPreviewクラス)に含まれるによって保持され、メイン アクティビティのコンテンツ ビューとしてアタッチされることを意味します。

問題は、Android のようにカメラのプレビューを表示したくないことです。つまり、プレビューを画面のサイズの1つに合わせて、もう1つのサイズをオーバーフローさせたい. Android のサンプルは、画面のサイズの 1 つに合わせて、もう 1 つを画面の境界内に収めます。

例: 画面サイズが 480x800 の Android デバイスを見てみましょう。480x640 のプレビュー サイズを選択します。Android は、デバイスの画面内に収まるようにこのプレビュー サイズを保持します。画面の幅に正確に収まる一方で、上下に 2 つの黒い四角形 (レターボックス) が表示されます。私の場合、そのプレビューを 1.25 倍に拡大して、サイズを 600x800 に変更します (つまり、プレビューとカメラの両方の最長辺を 800 の長さにします)。surfaceView次に、そのプレビュー サーフェス ( ) を少し左に移動して、このプレビューを中央に配置しようとします。この場合、左端の水平座標は -60 で、一番上の 0 になります。

私の問題は、を正しく移動できないことですSurfaceView。サイズは正しく変更されていますが、左 (画面の外) に移動できません。SOで検索すると、多くの可能な解決策が見つかりましたが、うまくいきませんでした。これはそれほど難しいことではないと確信しており、何か間違ったことをしているに違いありません。

これまで、次のようないくつかのソリューションを試してきました。

  • Android の例に従って、サイズ変更コード -onMeasure関数 - を次のように変更しました。
if (width * previewHeight < height * previewWidth) {

    final int scaledChildWidth = previewWidth * height / previewHeight;

    child.layout( (width - scaledChildWidth) / 2, 0, (width + scaledChildWidth) / 2, height);


} else {

    final int scaledChildHeight = previewHeight * width / previewWidth;

    child.layout(0, (height - scaledChildHeight) / 2, width, (height + scaledChildHeight) / 2);

}

これにより、プレビューが探しているサイズに正しくサイズ変更されますが、左端の座標は -60 であるはずですが、画面の左上隅から引き続きレンダリングされます。onMeasureコードの残りの部分は、前に述べた Android サンプル フォルダー内のものと同じであるため、機能の変更をここに貼り付けます。

  • の親コンテナを に変更しSurfaceViewScrollViewプレビューをスクロールします。

  • ViewGroup/ RelativeLayout/ FrameLayout/ LinearLayout/etcで負のマージンまたはパディングを使用する。この場合、いくつかのインターフェイス要素 (レイアウトに追加した他のボタン) は移動できましたが、SurfaceView.

  • falseに設定しようclipChildrenとしています。clipToPadding

  • centerInParentオプションで遊んでみる。

  • SurfaceView(スケーリングされたプレビュー サイズ) と同じサイズの新しい親レイアウトを作成し、中央に配置します。サイズも正しく変更されますが、画面の中央に配置されません。

  • 使用AbsoluteLayout(はい、非推奨であることは知っています;))

私が試した他の解決策は今思い出せませんが、これらが主なものだと思います。

要素が画面の左上隅から始まるのを防ぐことができなかったようです。

もちろん、さらに詳しい情報が必要な場合はリクエストできます。できるだけ早く回答するように努めます。この時点で本当に行き詰まりました。提供されたヘルプに非常に感謝しています。これを読むのに時間を割いてくれてありがとう:)

編集 1

このアプリケーションを Android 2.3.6 でテストしています。

4

1 に答える 1

1

久しぶりの回答ですが、これを理解するのに多くの時間を費やしました。

一部のAndroidデバイス (以下を参照) では、ディスプレイの境界を超えて拡張することはできませんSurfaceView。その場合、大きすぎて収まらない場合は、シフトして中央に配置されます。選択した解像度がディスプレイ サイズと一致しない場合は、パディングを追加するか、画像を引き伸ばす必要があります。あれは事実です。

次に、プレビュー サイズと同じ縦横比の画像サイズを選択してください。そうしないと、プレビューで見たのとまったく同じビューポートが画像に表示されません。違いが大きくない場合、これはあなたの場合は問題にならないかもしれませんが、私の場合はそうです。

一部のデバイスに関する注意: 古い HTC Desire S (Android 2.3) でこの動作が発生しました。Android 5.1 を搭載した Samsung S5 で期待どおりに動作します。誰かがこれに関連する情報(Androidバージョン、または一部のモデル...)を使用して回答を改善していただければ幸いです。

于 2015-09-09T11:02:37.810 に答える