Camera-SurfaceHolder に奇妙な問題があります。
アクティビティでカメラの画像を表示したい。私のGalaxyS1(CyanogenMod - Android 4.4)ではすべてうまく機能しますが、私のS3(CyanogenMod - Android 4.4)でも奇妙に見えます。
タイトル バーのない横長の画像は問題ありませんが、タイトル バーを表示したり縦長モードにすると、画像が歪んで見えます。
- - 編集 - -
助けてくれてありがとう、アレックス・コーン。あなたが正しいようです。ポートレート モードのプレビューがうまく機能するようになりました。それでも、横向きのビューでは歪んで見えます。プレビュースケールを確認しましたが、問題ないようです。私が見る限り、プレビューサイズも適切に設定しています。それで、それの何が問題なのですか?
現在のコードは次のとおりです。
private static final String TAG = CameraView.class.getSimpleName();
private SurfaceHolder surfaceHolder;
private Camera camera;
private List<Size> mSupportedPreviewSizes;
private Size mPreviewSize;
public CameraView(Activity activity) {
super(activity);
surfaceHolder = getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
camera = Camera.open();
mSupportedPreviewSizes = camera.getParameters()
.getSupportedPreviewSizes();
setCameraDisplayOrientation(activity, 0, camera);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);
} catch (IOException exception) {
camera.release();
camera = null;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
camera.stopPreview();
camera.release();
camera = null;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
if (mSupportedPreviewSizes != null) {
mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
}
}
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w,
int h) {...}
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, Camera camera) {...}
- - 編集 - -
onMeasure と surface Changed の値を記録しました。彼らは大丈夫のようです:
ポートレート:
変更された表面: 幅:720 高さ:1134
onMeasure: 幅:720 高さ:1134
風景:
変更された表面: 幅:1280 高さ:590
onMeasure: 幅:1280 高さ:590
プレビュー サイズ: 幅: 704 高さ:576
次の可能なプレビューサイズを取得します。
配列には 8 つの要素があります。
960×720、1280×720、1184×666、960×640、704×576、640 ×480、352 ×288、320×240
うまくいけば、誰でも助けることができます!
ありがとう、トバイアス