CameraX preview view changes height automatically

Viewed 679

I am trying to implement my Preview View inside a BottomSheet. Everything is working fine except that the preview size changes as show in below image. See the image here

As you can see the preview is getting out of the bottom sheet while I have set the Preview View height to 175dp. It changes to 469 dp at runtime. Below is my XML of bottomsheet.


<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>

Below is my java startCamera and bindPreview functions.

private void startCamera() {

        final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(AddNotesActivity.this);

        cameraProviderFuture.addListener(new Runnable() {
            @Override
            public void run() {
                try {

                    ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                    bindPreview(cameraProvider);

                } catch (ExecutionException | InterruptedException e) {
                    // No errors need to be handled for this Future.
                    // This should never be reached.
                }
            }
        }, ContextCompat.getMainExecutor(AddNotesActivity.this));
    }

 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();

            }
        });

    }

I need that preview view to stay inside the bottomsheet.

0 Answers
Related