【问题标题】:Crop camera preview for SurfaceViewSurfaceView 的裁剪相机预览
【发布时间】:2016-03-01 18:40:45
【问题描述】:

我有一个用于条形码扫描的 SurfaceView(this tutorial)。

<SurfaceView
        android:id="@+id/camera_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone" />

需要将裁剪后的相机预览设置为屏幕高度的 1/4。

我根据屏幕尺寸设置了视图尺寸:

cameraView = (SurfaceView) findViewById(R.id.camera_view);

final DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(metrics.widthPixels, metrics.heightPixels / 4);
        cameraView.setLayoutParams(layoutParams);

但是相机预览只是缩小了!

我是这样设置的

final BarcodeDetector barcodeDetector =
        new BarcodeDetector.Builder(this)
                .setBarcodeFormats(Barcode.ALL_FORMATS)
                .build();

final CameraSource cameraSource = new CameraSource
        .Builder(this, barcodeDetector)
        .setRequestedPreviewSize(metrics.widthPixels, metrics.heightPixels / 4)
        .setAutoFocusEnabled(true)
        .build();

cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                    cameraSource.start(cameraView.getHolder());
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                cameraSource.stop();
            }
        });

如何裁剪相机预览?只需要底部的 1/4 部分。

还需要添加一个透明层,上面有矩形取景器。

【问题讨论】:

    标签: android android-camera surfaceview


    【解决方案1】:

    您可能希望使用的是TextureViewSurfaceViews 不是为裁剪而设计的 - 视频显示调整为 SurfaceView 的大小是预期的行为。

    另一方面,TextureViews(从 API 级别 14+ 开始提供)允许您设置 .setTransform(Matrix matrix),其中矩阵包含有关如何缩放视频的数据,以及 .setTranslationX(float x).setTranslationY(float y)裁剪视频。 here 是一个很好的例子。

    如果您绝对必须使用 SurfaceView,我建议您考虑使用带有自定义渲染器的 GLSurfaceView 来缩放视频。一个好的起点是here

    【讨论】:

      【解决方案2】:

      我用 ViewGroup 解决了这个问题。

      在布局中:

          <com.superup.smartshelf.barcode.BarcodeCameraPreview
              android:id="@+id/preview"
              android:layout_width="match_parent"
              android:layout_height="0dp"
              android:layout_weight="0.25"/>
      

      在课堂上:

      public class BarcodeCameraPreview extends ViewGroup {
      
      private SurfaceView mSurfaceView;
      
      public BarcodeCameraPreview(final Context context, AttributeSet attrs) {
          super(context, attrs);
      
          mSurfaceView = new SurfaceView(context);
          mSurfaceView.getHolder().addCallback(new SurfaceCallback());
          addView(mSurfaceView);
      }
      
          @Override
          protected void onLayout(boolean changed, int l, int t, int r, int b) {
              // crop view
              int actualPreviewWidth = getResources().getDisplayMetrics().widthPixels;
              int actualPreviewHeight = getResources().getDisplayMetrics().heightPixels;
      
      
              if (mSurfaceView != null) {
                  mSurfaceView.layout(0, 0, actualPreviewWidth, actualPreviewHeight);
              }
          }
      
      // camera methods
      
      }
      

      活动中:

      BarcodeCameraPreview camera = (BarcodeCameraPreview) findViewById(R.id.preview);
      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(metrics.widthPixels, metrics.heightPixels / 4);
      camera.setLayoutParams(layoutParams);
      

      【讨论】:

        【解决方案3】:

        您无法通过缩小视图来实现裁剪。您可以使用其他布局覆盖相机预览,并有效隐藏图片的上 3/4。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-05
          • 2012-01-25
          • 2018-12-23
          • 1970-01-01
          • 2012-08-04
          • 1970-01-01
          • 2014-10-21
          相关资源
          最近更新 更多