Android CameraX预览视图会自动更改高度

Android CameraX预览视图会自动更改高度,android,android-camerax,android-bottomsheetdialog,Android,Android Camerax,Android Bottomsheetdialog,我试图在底部工作表中实现我的预览视图。一切正常,除了预览大小如下图所示发生变化。 正如您所看到的,当我将预览视图高度设置为175dp时,预览正在从底部图纸中取出。它在运行时更改为469 dp。 下面是我的底页XML <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res

我试图在底部工作表中实现我的预览视图。一切正常,除了预览大小如下图所示发生变化。

正如您所看到的,当我将预览视图高度设置为175dp时,预览正在从底部图纸中取出。它在运行时更改为469 dp。 下面是我的底页XML


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <androidx.camera.view.PreviewView
        android:id="@+id/camera"
        android:layout_width="match_parent"
        android:layout_height="175dp"
        android:layout_marginStart="12dp"
        android:layout_marginTop="12dp"
        android:layout_marginEnd="12dp"
        android:contentDescription="nothing"

        app:scaleType="fitCenter">

    </androidx.camera.view.PreviewView>

    <Button
        android:id="@+id/capture"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:background="@android:drawable/ic_menu_camera" />
</LinearLayout>


我需要预览视图保持在底片内。

这可能是因为PreviewView在引擎盖下使用SurfaceView。你能把它设置成使用TextureView吗(打电话并传过去)。谢谢,伙计,它真的帮了我的忙done@HusaynHakeem谢谢,这很有效。但API>=24中建议使用SurfaceView。为什么违背谷歌的建议是解决与预览高度看似无关的问题的一种方式(@varakalinna Fair point,尽管问题并非真正与预览高度有关,但更多的是与渲染预览的曲面有关。在这种情况下需要使用TextureView(ViewPager中的PreviewView)更多的是PreviewView的一个约束,这源于它处理视图和相机堆栈。使用TextureView允许SurfaceView不支持的某些行为(至少与PreviewView中当前构建的方式不同)。使用SurfaceView是一个不错的选择,因为它提供了性能优势,但在某些情况下它并不适合。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <androidx.camera.view.PreviewView
        android:id="@+id/camera"
        android:layout_width="match_parent"
        android:layout_height="175dp"
        android:layout_marginStart="12dp"
        android:layout_marginTop="12dp"
        android:layout_marginEnd="12dp"
        android:contentDescription="nothing"

        app:scaleType="fitCenter">

    </androidx.camera.view.PreviewView>

    <Button
        android:id="@+id/capture"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:background="@android:drawable/ic_menu_camera" />
</LinearLayout>

 void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {

        Preview preview = new Preview.Builder()
                .build();

        CameraSelector cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build();

        ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                .build();

        ImageCapture.Builder builder = new ImageCapture.Builder();

        //Vendor-Extensions (The CameraX extensions dependency in build.gradle)
        HdrImageCaptureExtender hdrImageCaptureExtender = HdrImageCaptureExtender.create(builder);

        // Query if extension is available (optional).
        if (hdrImageCaptureExtender.isExtensionAvailable(cameraSelector)) {
            // Enable the extension if available.
            hdrImageCaptureExtender.enableExtension(cameraSelector);
        }

        final ImageCapture imageCapture = builder
                .setTargetRotation(Surface.ROTATION_0)
                .build();

        mPreviewView.setScaleType(PreviewView.ScaleType.FILL_CENTER);
      
        preview.setSurfaceProvider(mPreviewView.getSurfaceProvider());

        Toast.makeText(this, ""+mPreviewView.getHeight()+"---"+mPreviewView.getWidth(), Toast.LENGTH_SHORT).show();
        Camera camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis, imageCapture);

        capture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bitmap image = mPreviewView.getBitmap();
                Toast.makeText(AddNotesActivity.this, "Captured", Toast.LENGTH_SHORT).show();

            }
        });

    }