使用 Surfaceview 尺寸调整相机视图

Adapt camera view with Surfaceview dimension

我正在开发一个可以读取条形码的应用程序。在第一步中,我有一个大的 SurfaceView,我可以在其中清楚地看到相机预览,但现在我将 Surfaceview 的尺寸设置为条形码的尺寸,但我的相机可视化效果很差(它太小了)。有人可以帮我拉伸相机预览吗?谢谢

此处管理探测器和表面视图:

public class LettoreBarcode 扩展片段 {

View view;
SurfaceView surfaceView;
Handler handler;

private BarcodeDetector detector;       
private CameraSource cameraSource;       
private TextView code;
SparseArray<Barcode> items;


private static Button btnBack;

String barcode = "" ;
SparseArray<Articoli> groups = new SparseArray<Articoli>();

Context _context = null;
ProductsAdapter.ViewHolder _ViewHolder = null;

public LettoreBarcode(){

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_barcode_scanner, container, false);

   surfaceView = (SurfaceView) view.findViewById(R.id.surfaceView);        

    detector = new BarcodeDetector.Builder(getActivity()).setBarcodeFormats(Barcode.ALL_FORMATS).build();   
    final Dialog d = new Dialog(getActivity());
    btnBack = (Button) view.findViewById(R.id.btnBack);
    handler = new Handler();

    if(!detector.isOperational()){
        Toast.makeText(getActivity(), "Detector non attivabile", Toast.LENGTH_LONG).show();
    }

    cameraSource = new CameraSource.Builder(getActivity(), detector).setAutoFocusEnabled(true).build();        


    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            AttivaCamera();
        }

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

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }
    });

    detector.setProcessor(new Detector.Processor<Barcode>() {
        @Override
        public void release() {

        }

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections) {       
            items = detections.getDetectedItems();           
            if (items.size() > 0){      
               getActivity().runOnUiThread(new Runnable() {      
                    @Override
                    public void run() {

                        if (items.valueAt(0) != null){                               
                            //do something

                            handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    DisattivaCamera();

                                }
                            },10);            //1000
                        }else
                        {
                            d.setContentView(R.layout.dialog_barcode_assente);
                            d.setTitle("Scanner");
                            d.setCancelable(true);
                            d.show();
                            DisattivaCamera();
                        }
                    }
                });

            }
        }

    });

    btnBack.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getActivity().onBackPressed();
        }
    });

   return view;
}

private void AttivaCamera()
{
    try{
        cameraSource.start(surfaceView.getHolder());    
    }catch(IOException e){
        Toast.makeText(getActivity(), "Errore nell'avvio della fotocamera", Toast.LENGTH_LONG).show();
    }
}

private void DisattivaCamera()
{       
    cameraSource.stop(); 
}

}

这是我用小表面视图可视化相机的方式:

https://i.stack.imgur.com/TMunJ.png

我是 android 开发新手,如果代码中可能有很多错误,我很抱歉。

我的英语也很抱歉..

谢谢大家!

为了只显示相机输入的一部分,即在屏幕上裁剪它,您需要一个尺寸适合相机框架纵横比的表面视图,并用一些不透明的视图覆盖它以仅留下它的一部分可见。不要将 SurfaeView 放在滚动布局中:

所以,而不是

<SurfaceView width: match_parent height: 400dp />

你需要例如FrameLayout 如此处解释:Is it possible to crop camera preview?

这不会改变到达条形码检测器的帧。但这不应该让你担心;检测器将正确处理未裁剪的图像。