5

Camera API 2 を使用してビデオ録画を回避するために、Google の公式サンプルを使用しています。しかし、問題は、画面の向きを縦向きにのみ制限したため、全画面表示にできないことです。編集したxmlと公式のxmlを次に示します。

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

    <AutoFitTextureView
        android:id="@+id/texture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

        <Button
            android:id="@+id/video"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/label_record" />

        <ImageView
            android:id="@+id/info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|right"
            android:contentDescription="Description"
            android:padding="20dp"
            android:src="@drawable/ic_more" />

    </FrameLayout>

</RelativeLayout>

ここでは、ビデオの画面サイズをアスペクト比で に設定していると思いますが、TextureViewフルスクリーンにすることはできませんでした。どんな助けでも大歓迎です。

mVideoSize = chooseVideoSize(map.getOutputSizes(MediaRecorder.class));
mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height, mVideoSize);
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    mTextureView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight());
} else {
    mTextureView.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth());
}

ここに画像の説明を入力

4

2 に答える 2

2

記録の画面サイズを制御するには、プレビュー サイズを処理する必要があります。同じ方法を使用して、クラスchooseVideoSizeの出力サイズを取得してプレビューを全画面表示にします。SurfaceTexture

private static Size chooseVideoSize(Size[] choices) {
        for (Size size : choices) {
            if (size.getWidth() == size.getHeight() * 4 / 3 && size.getWidth() <= 1080) {
                return size;
            }
        }
        Log.e(TAG, "Couldn't find any suitable video size");
        return choices[choices.length - 1];
    }

あれは

  mPreviewSize = chooseVideoSize(map.getOutputSizes(SurfaceTexture.class));
于 2016-06-03T05:10:33.207 に答える
1

TextureViewおそらく、正しい向きにスケーリングおよび回転する変換メソッドを実装できます。

private void transformImage(int width, int height) {
    if (mPreviewSize == null || mTextureView == null) {
        return;
    }
    Matrix matrix = new Matrix();
    int rotation = getWindowManager().getDefaultDisplay().getRotation();
    RectF textureRectF = new RectF(0, 0, width, height);
    RectF previewRectF = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth());
    float centerX = textureRectF.centerX();
    float centerY = textureRectF.centerY();
    if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
        previewRectF.offset(centerX - previewRectF.centerX(),
                centerY - previewRectF.centerY());
        matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL);
        float scale = Math.max((float) width / mPreviewSize.getWidth(),
                (float) height / mPreviewSize.getHeight());
        matrix.postScale(scale, scale, centerX, centerY);
        matrix.postRotate(90 * (rotation - 2), centerX, centerY);
    }
    mTextureView.setTransform(matrix);
}

その後、以下から transform メソッドを呼び出す必要がありますonResume

public void onResume() {
    super.onResume();
    if (mTextureView.isAvailable()) {
        transformImage(mTextureView.getWidth(), mTextureView.getHeight());
    } else {
        mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
    }
}

そして上SurfaceTextureListener.Callback

private TextureView.SurfaceTextureListener mSurfaceTextureListener =
        new TextureView.SurfaceTextureListener() {
            @Override
            public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
                transformImage(width, height);
            }

            @Override
            public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
            }

            @Override
            public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
                return false;
            }

            @Override
            public void onSurfaceTextureUpdated(SurfaceTexture surface) {
            }
        };

ソース

于 2016-06-01T18:52:37.057 に答える