1

ランドスケープモードでFrameLayout内のAndroidカメラを開いていると、画面は次のようになります-

ここに画像の説明を入力

しかし、FrameLayout の ImageView 内で同じ画像を開くと、次のようになります。 ここに画像の説明を入力

写真の内容と2番目の画像に描かれた面白い四角は無視してください。違いは、最初の CameraView が画面全体に開いているか、高さが画面の頭​​に触れていましたが、2 番目の画像が画像を縮小して収まることです。

最初の画像も2番目のように機能したいので、定義された四角形の下に収まる必要があります。唯一の目的は Camera View で、ImageView は同じ Look を示します。

必要に応じてレイアウト全体を変更することもできます。FacePreviewImageView は、追加する画像です。

最初のカメラ ビューは Android カメラのみで、Android フレームレイアウトに追加しています。

Camera mCamera = Camera.open(1);
FrameLayout layout = (FrameLayout) findViewById(R.id.ll2);
layout.addView(new CameraView());

2番目のフレームのように追加しています-

layout.removeAllViews();
                layout.addView(faceImageView);
                faceView.setVisibility(View.GONE);
                faceImageView.setVisibility(View.VISIBLE);

レイアウト XML は -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" 
    android:baselineAligned="false">

    <LinearLayout
        android:id="@+id/ll1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" 
        android:orientation="horizontal">


    </LinearLayout>

     <FrameLayout
        android:id="@+id/ll2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="0.5"
        android:orientation="horizontal" >

         <com.example.defaultfacetracker.FacePreviewImageView
             android:id="@+id/facePreview"             
             android:layout_width="match_parent"
             android:layout_height="match_parent" 
             android:src="@android:drawable/toast_frame"
             /> 

    </FrameLayout>

    <LinearLayout
        android:id="@+id/ll3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:text="Process" />

    </LinearLayout>

</LinearLayout>

私のSurfaceHolderは次のように見えます-

class Preview extends SurfaceView implements SurfaceHolder.Callback {
    SurfaceHolder mHolder;
    Camera mCamera;
    Camera.PreviewCallback previewCallback;

    Preview(Context context, Camera.PreviewCallback previewCallback, Camera mCamera2) {
        super(context);
        this.previewCallback = previewCallback;
        this.mCamera = mCamera2;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, acquire the camera and tell it where
        // to draw.
      //  mCamera = Camera.open(1);
        //mCamera.setDisplayOrientation(270);
        try {
           mCamera.setPreviewDisplay(holder);
        } catch (IOException exception) {
            mCamera.release();
            mCamera = null;
            // TODO: add more exception handling logic here
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // Surface will be destroyed when we return, so stop the preview.
        // Because the CameraDevice object is not a shared resource, it's very
        // important to release it when the activity is paused.
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }


    private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
        final double ASPECT_TOLERANCE = 0.05;
        double targetRatio = (double) w / h;
        if (sizes == null) return null;

        Size optimalSize = null;
        double minDiff = Double.MAX_VALUE;

        int targetHeight = h;

        // Try to find an size match aspect ratio and size
        for (Size size : sizes) {
            double ratio = (double) size.width / size.height;
            if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }

        // Cannot find the one match the aspect ratio, ignore the requirement
        if (optimalSize == null) {
            minDiff = Double.MAX_VALUE;
            for (Size size : sizes) {
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
        }
        return optimalSize;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // Now that the size is known, set up the camera parameters and begin
        // the preview.
        Camera.Parameters parameters = mCamera.getParameters();

        List<Size> sizes = parameters.getSupportedPreviewSizes();
        Size optimalSize = getOptimalPreviewSize(sizes, w, h);
        parameters.setPreviewSize(optimalSize.width, optimalSize.height);

        mCamera.setParameters(parameters);
        if (previewCallback != null) {
            mCamera.setPreviewCallbackWithBuffer(previewCallback);
            Camera.Size size = parameters.getPreviewSize();
            byte[] data = new byte[size.width*size.height*
                    ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())/8];
            mCamera.addCallbackBuffer(data);
        }
//        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
//          mCamera.setDisplayOrientation(90);
//          
//      } else {
//          mCamera.setDisplayOrientation(0);
//      }
        mCamera.startPreview();
    }

}
4

1 に答える 1

4

カメラのプレビュー サイズの高さと幅を間違って設定し、setDisplayOrientationも使用する必要があります。高さと幅を設定し、ディスプレイの向きを設定するコードを表示してください。

また、ここでカメラの初期化が適切に表示される場合があります

于 2013-10-18T11:16:34.620 に答える