6

Korzystam z przykładu czytnika kodów kreskowych z interfejsu API Android Vision firmy Google. Rozmiar podglądu nie wypełnia całego dostępnego miejsca (korzystam z Nexusa 4, a na prawo od podglądu jest biała, nieużywana przestrzeń, około 1/3 szerokości).Rozmiar podglądu dla skanera kodów kreskowych z wizji api

Chciałbym móc uruchomić ten przykład na różnych urządzeniach i zawsze wypełniać całą dostępną przestrzeń.

więc nieco Grałem w to:

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

Jakieś pomysły?

Dzięki!

+0

Mam do czynienia z tym samym problemem. mógłbym podać rozwiązanie. Już przeszedłem przez wątki github, ale nie mogłem się dowiedzieć, jak ograniczyć obszar wykrywania. – Madhu

Odpowiedz

10

prostu usunąć lub komentarz poniżej kod z klasy CameraSourcePreview

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

i używać layoutHeight zamiast childHeight z „CameraSourcePreview” klasy w tej pętli - do (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

Chociaż to technicznie działa, mam dwie uwagi. 1: w tej chwili używasz tylko layoutWidth i layoutHeight, możesz wyciąć większość kodu. 2: Ta metoda rozciąga wideo, NIE zachowuje proporcji. –

+0

Naprawiłem to, robiąc rozmiar podglądu kamery jak w Ratio, Ponieważ potrzebuję mniejszego rozmiaru podglądu kamery –

4

Istnieją dwa sposoby, aby obraz z kamery wypełnić cały ekran.

  1. Akesh Dubey's answer, który wyświetla cały obraz poprzez jego rozciągnięcie w celu dopasowania do szerokości i wysokości układu. Jednak współczynnik proporcji nie jest zachowywany.
  2. Moja odpowiedź poniżej, która powoduje przycięcie obrazu w celu dopasowania bez utraty współczynnika proporcji.

Aby dopasować obraz do kształtu, wystarczy zmienić kod > w <. Znajdź poniższą instrukcję if i zmień warunek:

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

zadziałało! Dzięki wielkie!! –

+0

Twoje rozwiązanie jest DOSKONAŁE lepsze niż jakiekolwiek inne, jakie widziałem (i znacznie prostsze ...). Nadal mamy problem w każdym przypadku (rozciąganie lub przycinanie), ale w przypadku skanera kodu QR, powiedziałbym, że przycinanie jest o wiele lepsze. – Keysaw