6

Sto utilizzando l'esempio di lettore di codici a barre dall'API di Google Vision di Google. La dimensione dell'anteprima non sembra riempire tutto lo spazio disponibile (sto usando un Nexus 4 e c'è uno spazio bianco non usato a destra dell'anteprima, circa 1/3 della larghezza).Dimensione anteprima per scanner di codici a barre da vision api

Mi piacerebbe essere in grado di eseguire questo esempio su vari dispositivi e averlo sempre riempire tutto lo spazio disponibile.

Così il bit ho giocato con è:

CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector).setFacing(CameraSource.CAMERA_FACING_BACK).setRequestedPreviewSize(?, ?).setRequestedFps(15.0f); 

Tutte le idee?

Grazie!

+0

Sto affrontando lo stesso problema. potrebbe per favore fornire la soluzione. Ho già provato i thread github ma non sono riuscito a capire come limitare l'area di rilevamento. – Madhu

risposta

10

sufficiente rimuovere o commento qui sotto il codice dalla classe CameraSourcePreview

if (childHeight > layoutHeight) { 
    childHeight = layoutHeight; 
    childWidth = (int)(((float) layoutHeight/(float) height) * width); 
} 

e utilizzare layoutHeight invece di childHeight di classe "CameraSourcePreview" in questo ciclo - per (int i = 0; i < getChildCount(); ++ i) {...}

if (mCameraSource != null) 
    { 
     Size size = mCameraSource.getPreviewSize(); 
     if (size != null) 
     { 
      width = size.getWidth(); 
      height = size.getHeight(); 
     } 
    } 

    // Swap width and height sizes when in portrait, since it will be rotated 90 degrees 
    if (isPortraitMode()) 
    { 
     int tmp = width; 

     //noinspection SuspiciousNameCombination 
     width = height; 
     height = tmp; 
    } 

    final int layoutWidth = right - left; 
    final int layoutHeight = bottom - top; 

    // Computes height and width for potentially doing fit width. 
    int childWidth = layoutWidth; 
    int childHeight = (int) (((float) layoutWidth/(float) width) * height); 

    for (int i = 0; i < getChildCount(); ++i) 
    { 
     getChildAt(i).layout(0, 0, childWidth, layoutHeight); 
    } 

    try 
    { 
     startIfReady(); 
    } 
    catch (SecurityException se) 
    { 
     Log.e(TAG, "Do not have permission to start the camera", se); 
    } 
    catch (IOException e) 
    { 
     Log.e(TAG, "Could not start camera source.", e); 
    } 
} 
+1

Mentre funziona tecnicamente, ho due osservazioni. 1: adesso usi solo layoutWidth e layoutHeight, puoi ritagliare la maggior parte del codice. 2: questo metodo allunga il video, NON preserva le proporzioni. –

+0

L'ho risolto rendendo la dimensione di Camera Preview come in Ratio, Perché ho bisogno di una dimensione più piccola dell'anteprima della fotocamera –

4

ci sono due modi per rendere l'immagine della telecamera riempire il schermo intero

  1. Akesh Dubey's answer, che visualizza l'intera immagine estendendola per adattarla alla larghezza e all'altezza del layout. Tuttavia, le proporzioni non vengono conservate.
  2. La mia risposta di seguito, che ritaglia l'immagine per adattarla senza sacrificare le proporzioni.

Per ritagliare l'immagine, è sufficiente modificare uno > in un <. Trova la seguente istruzione if e modifica la condizione in questo modo:

if (childHeight < layoutHeight) { 
    childHeight = layoutHeight; 
    childWidth = (int)(((float) layoutHeight/(float) height) * width); 
} 
+0

Ha funzionato! Grazie mille !! –

+0

La tua soluzione è MOLTO migliore di qualsiasi altra che ho visto (e molto più semplice ...). Abbiamo comunque un problema (allungamento o ritaglio), ma nel caso dello scanner di codici QR, direi che il ritaglio è di gran lunga migliore. – Keysaw