ポートレート モードでは画像が垂直方向に引き伸ばされて表示され、ランドスケープ モードでは水平方向に引き伸ばされて表示されます。
画像をキャプチャした後、適切なサイズで表示されますが。
この問題を解決するにはどうすればよいですか?
ポートレート モードでは画像が垂直方向に引き伸ばされて表示され、ランドスケープ モードでは水平方向に引き伸ばされて表示されます。
画像をキャプチャした後、適切なサイズで表示されますが。
この問題を解決するにはどうすればよいですか?
表示サイズに合ったプレビュー サイズを選択する必要があります。プレビュー サイズの設定を変更することをお勧めしますSurfaceView
。プレビュー データは問題ありませんが、歪んでいません。縦横比の異なる面にぶつけると歪んで見えます。
全画面表示の場合、カメラのプレビュー サイズがそのサイズに一致することがわかるはずです。少なくとも、同じ縦横比のカメラが存在するはずです。たとえば、画面が 640x480 の場合、320x240 のプレビュー サイズはフルスクリーンで引き伸ばされて表示されませんSurfaceView
。
(1) 利用可能なプレビュー サイズ (2) ビューに基づいて、プレビュー サイズを制限する必要があります。それでも必要な場合の私の解決策は次のとおりです。
private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private void startPreview() {
try {
/**
* Orientation should be adjusted, see http://stackoverflow.com/questions/20064793/how-to-fix-camera-orientation/26979987#26979987
*/
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
Camera.Size previewSize = null;
float closestRatio = Float.MAX_VALUE;
int targetPreviewWidth = isLandscape() ? getWidth() : getHeight();
int targetPreviewHeight = isLandscape() ? getHeight() : getWidth();
float targetRatio = targetPreviewWidth / (float) targetPreviewHeight;
Log.v(TAG, "target size: " + targetPreviewWidth + " / " + targetPreviewHeight + " ratio:" + targetRatio);
for (Camera.Size candidateSize : previewSizes) {
float whRatio = candidateSize.width / (float) candidateSize.height;
if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) {
closestRatio = whRatio;
previewSize = candidateSize;
}
}
Log.v(TAG, "preview size: " + previewSize.width + " / " + previewSize.height);
parameters.setPreviewSize(previewSize.width, previewSize.height);
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
}
camera.startPreview() を呼び出す前にこれを追加して、これを修正しました。
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(yourSurfaceView.getWidth(), yourSurfaceView.getHeight());
camera.setParameters(parameters);
それは誰かを助けるかもしれません。
解決策は簡単です!アクションバーの下でサーフェスビューを使用する場合、これが問題になる可能性があります。この行を使用して修正できますが、アクションバーを使用してテストしていません。
これを使って:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
プレビューについて話している場合は、SurfaceView のサイズをカメラのプレビュー サイズと同じに設定してみてください。そうすれば、プレビューは拡大縮小されません。