6

Pracowałem z camera2 api demo from google i niestety przykładowa aplikacja została stworzona do wyświetlania podglądu tekstury na około 70% wysokości ekranu, po rozejrzeniu się udało mi się ustalić, że był spowodowany AutoFitTextureView przesłanianie metody onMeasure() jak pokazano poniżej:Podgląd pełnego ekranu z Androidem z poprawnym współczynnikiem proporcji

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    int width = MeasureSpec.getSize(widthMeasureSpec); 
    int height = MeasureSpec.getSize(heightMeasureSpec); 
    if (0 == mRatioWidth || 0 == mRatioHeight) { 
     setMeasuredDimension(width, height); 
    } else { 
     if (width < height * mRatioWidth/mRatioHeight) { 
      setMeasuredDimension(width, width * mRatioHeight/mRatioWidth); 
     } else { 
      setMeasuredDimension(height * mRatioWidth/mRatioHeight, height); 
     } 
    } 
} 

próbowałem skorygować poprzez ustawienie prawidłowych wysokościach i szerokościach w setMeasuredDimension(width, height);, aby to naprawić problem wysokość i dał mi podgląd pełnoekranowy z textureview, jednak współczynnik proporcji jest całkowicie zepsuty i wypaczony na każdym urządzeniu, co jest standardem d sposób ustalenia tego? Widzę, że wiele aplikacji w sklepie Play znalazło sposób na rozwiązanie tego problemu, ale nie udało się znaleźć rozwiązania, każda pomoc będzie długa, dzięki.

+0

Hej, znalazłeś jakieś rozwiązanie? w obliczu tego samego problemu .. proszę o pomoc. – iMDroid

+0

Odpowiedź zaktualizowana poniżej –

Odpowiedz

0

Jeśli chcesz pełnoekranowy, niezakłócony podgląd, musisz wybrać rozdzielczość podglądu dla kamery zgodnej z proporcjami ekranu.

Jeśli jednak twój rozmiar ekranu nie jest standardowy (zazwyczaj 16: 9 lub 4: 3), zwłaszcza gdy odejmiesz miękkie przyciski i pasek powiadomień (zakładając, że nie jesteś w pełni pełny ekran) , wtedy jedyną opcją dla podglądu wypełnienia ekranu jest wycięcie jego części.

Powinieneś być w stanie zmodyfikować macierz transformacji TextureView, aby usunąć zniekształcenie, patrząc na szerokość i wysokość widoku oraz wybraną szerokość i wysokość podglądu, ale to koniecznie spowoduje, że część z nich zostanie wyłączona.

+0

Hej, jak byś poszła i "powiększyła", aby zachować proporcje, ale wypełnić cały ekran podglądem kamery? Opisujesz to w swoim ostatnim akapicie, ale nie rozumiem, jak poprawnie modyfikować macierz transformacji. – Csharpest

+1

Macierz przekształceń jest standardową macierzą 4x4 grafiki w jednorodnych współrzędnych. Aby wypełnić ekran, wystarczy równomiernie skalować obraz, aż czarne paski znikną (należy pamiętać, że spowoduje to usunięcie niektórych danych obrazu poza ekranem). Jest to z pamięci, ale macierz skali to tylko [s 0 0 0; 0 s 0 0; 0 0 0 0; 0 0 0 1] gdzie s jest współczynnikiem skali (więc s = 2, dla podwójnego rozmiaru). Pomnóż tę macierz z macierzą transformacji, którą otrzymujesz z getTransform (macierz mnożenie, nie elementowo) i ustaw ją jako transformację za pomocą setTransform. –

+0

W porządku, rozumiem metodę matrix.setScale (x, y). Spróbuję tego "zwielokrotnić tę macierz z matrycą transformacji ..." - jutro część i zobaczyć, czy mogę ją uruchomić. Nie jestem w 100% pewien, co przez to rozumiesz. Mogę uderzyć cię ponownie, dziękuję jak dotąd! – Csharpest

4

Byłem w stanie naprawić problem przez przełączenie setMeasuredDimension();

int width = MeasureSpec.getSize(widthMeasureSpec); 
    int height = MeasureSpec.getSize(heightMeasureSpec); 
    if (0 == mRatioWidth || 0 == mRatioHeight) { 
     setMeasuredDimension(width, height); 
    } else { 
     if (width < height * mRatioWidth/mRatioHeight) { 
      setMeasuredDimension(height * mRatioWidth/mRatioHeight, height); 
     } else { 
      setMeasuredDimension(width, width * mRatioHeight/mRatioWidth); 
     } 
    } 
+0

Witaj Edmund, co masz na myśli przez "switching setMeasuredDimension()"? Mam taki sam problem z pełnoekranowym aparatem2. Czy możesz podać kod, którego używasz w metodzie onMeasure, aby uzyskać pełny ekran pracy bez zniekształceń? –

+0

Przepraszamy za spóźnioną odpowiedź, zaktualizowałem moją odpowiedź –

+1

Dzięki za zaktualizowaną odpowiedź, ale to rozwiązanie rozszerza podgląd. – iMDroid

0

I niech cię poniżej kod, który użyliśmy do pomiaru podgląd, który obsługuje 4: 3, 16: 9 i 1: 1 rozmiary podglądu. Wysokość jest skalowana, ponieważ aplikacja blokuje portret, nie obraca się do pionu.

Mam nadzieję, że pomoże Tobie lub komuś z tym samym problemem!

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    int width = MeasureSpec.getSize(widthMeasureSpec); 
    int height = MeasureSpec.getSize(heightMeasureSpec); 

    Log.d(TAG, "[onMeasure] Before transforming: " + width + "x" + height); 

    int rotation = ((Activity) getContext()).getWindowManager().getDefaultDisplay().getRotation(); 
    boolean isInHorizontal = Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation; 

    int newWidth; 
    int newHeight; 

    Log.d(TAG, "[onMeasure] Get measured dimensions: " + getMeasuredWidth() + "x" + getMeasuredHeight()); 

    if (isInHorizontal) { 
     newHeight = getMeasuredHeight(); 
     if (mAspectRatioOneOne) newWidth = getMeasuredHeight(); 
     else newWidth = (int) (newHeight * mAspectRatio); 
    } else { 
     newWidth = getMeasuredWidth(); 
     if (mAspectRatioOneOne) newHeight = getMeasuredWidth(); 
     else newHeight = (int) (newWidth * mAspectRatio); 
    } 

    setMeasuredDimension(newWidth, newHeight); 
    Log.d(TAG, "[onMeasure] After transforming: " + getMeasuredWidth() + "x" + getMeasuredHeight()); 

} 
Powiązane problemy