首页 > 解决方案 > 使用 Surfaceview 尺寸调整相机视图

问题描述

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

这里管理检测器和表面视图:

公共类 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开发的新手,所以如果代码中有很多错误,我很抱歉。

对不起我的英语也..

谢谢你们!

标签: androidcamerasurfaceviewdimensions

解决方案


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

所以,而不是

<SurfaceView width: match_parent height: 400dp />

您需要例如 FrameLayout,如下所述:是否可以裁剪相机预览?

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


推荐阅读