0

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

うまくいけば、誰でも助けることができます!

ありがとう、トバイアス

4

1 に答える 1