Адаптируйте вид камеры с измерением Surfaceview - PullRequest
0 голосов
/ 28 сентября 2018

Я разрабатываю приложение, в котором я читаю штрих-код.На первом этапе у меня был большой 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, поэтому прошу прощения, если в коде может быть много ошибок.

Извините за мой английский также..

Спасибо вам, ребята!

1 Ответ

0 голосов
/ 30 сентября 2018

Чтобы отобразить только часть входного сигнала камеры, т.е. обрезать его на экране, вам необходим вид поверхности, размеры которого соответствуют формату кадра камеры, и наложите его на некоторые непрозрачные виды, чтобы оставить только часть изображения.это видно.Не помещайте SurfaeView в макет прокрутки:

Итак, вместо

<SurfaceView width: match_parent height: 400dp />

вам понадобится, например, FrameLayout, как описано здесь: Возможно ли обрезать предварительный просмотр камеры?

Это не изменит кадр, который поступает на детектор штрих-кода.Но это не должно беспокоить вас;детектор будет правильно обрабатывать необрезанное изображение.

...