私は現在、写真の撮影とビデオの録画の両方にデバイスのカメラを使用する Android アプリケーションを開発しています。このアプリケーションは、API レベル >= 8 (Froyo) で動作する必要があります。
これまで、Android のサンプルに基づいてカメラ コードを実装してきました。それはで見つけることができます<ADT folder>/sdk/samples/<android_version>/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java
-私は「android 11」の例に従ってカメラを切り替え、残りは「android 8」に切り替えます。これは、カメラ プレビューがSurfaceView
ViewGroup
(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 サンプル フォルダー内のものと同じであるため、機能の変更をここに貼り付けます。
の親コンテナを に変更し
SurfaceView
、ScrollView
プレビューをスクロールします。ViewGroup
/RelativeLayout
/FrameLayout
/LinearLayout
/etcで負のマージンまたはパディングを使用する。この場合、いくつかのインターフェイス要素 (レイアウトに追加した他のボタン) は移動できましたが、SurfaceView
.falseに設定しよう
clipChildren
としています。clipToPadding
centerInParent
オプションで遊んでみる。SurfaceView
(スケーリングされたプレビュー サイズ) と同じサイズの新しい親レイアウトを作成し、中央に配置します。サイズも正しく変更されますが、画面の中央に配置されません。使用
AbsoluteLayout
(はい、非推奨であることは知っています;))
私が試した他の解決策は今思い出せませんが、これらが主なものだと思います。
要素が画面の左上隅から始まるのを防ぐことができなかったようです。
もちろん、さらに詳しい情報が必要な場合はリクエストできます。できるだけ早く回答するように努めます。この時点で本当に行き詰まりました。提供されたヘルプに非常に感謝しています。これを読むのに時間を割いてくれてありがとう:)
編集 1
このアプリケーションを Android 2.3.6 でテストしています。