6

Ich habe mit der camera2 api demo from google gearbeitet und leider ist die Beispielanwendung gebaut, um die Textureview-Vorschau bei etwa 70% der Bildschirmhöhe anzuzeigen, nachdem ich mich umgesehen habe wurde von der AutoFitTextureView die onMeasure() Verfahren wie unten dargestellt zwingenden verursacht wurde:android textureview Vollbild-Vorschau mit korrektem Seitenverhältnis

@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); 
     } 
    } 
} 

ich versuchte, dies zu korrigieren, indem die richtigen Höhen und Breite in setMeasuredDimension(width, height); Einstellung dieser die Höhe Problem behoben und gab mir eine Vollbild-Vorschau von der textureview, aber das Seitenverhältnis ist bei jedem Gerät komplett kaputt und verzogen, was ist der Standard d Möglichkeit, dies zu beheben? Ich sehe, dass viele Apps im Play Store einen Weg gefunden haben, dieses Problem zu lösen, aber noch nicht in der Lage waren, einen Fix zu finden. Jede Hilfe wird einen langen Weg gehen, danke.

+0

Hey Sie haben eine Lösung gefunden? mit dem gleichen Problem konfrontiert .. bitte helfen. – iMDroid

+0

Antwort aktualisiert unter –

Antwort

0

Wenn Sie Vollbild, unverzerrte Vorschau möchten, dann müssen Sie eine Vorschau Auflösung für die Kamera auswählen, die das Seitenverhältnis des Bildschirms entspricht.

Wenn Ihre Bildschirmgröße jedoch keine Standardgröße (16: 9 oder 4: 3 im Grunde) ist, besonders wenn Sie die Softtasten und die Benachrichtigungsleiste abziehen (vorausgesetzt, Sie sind nicht vollständig im Vollbildmodus) , dann ist die einzige Option, die Vorschau auf den Bildschirm zu füllen, etwas davon zu entfernen.

Sie sollten in der Lage sein, die Transformationsmatrix von TextureView zu modifizieren, um die Verzerrung zu entfernen, indem Sie die Breite und Höhe der Ansicht und die ausgewählte Breite und Höhe der Vorschau betrachten.

+0

Hey, wie würdest du gehen und "hineinzoomen", um das Seitenverhältnis beizubehalten aber den ganzen Bildschirm mit der Kameravorschau zu füllen? Sie beschreiben es in Ihrem letzten Absatz, aber ich verstehe nicht, wie Sie die Transformationsmatrix richtig modifizieren. – Csharpest

+1

Die Transformationsmatrix ist eine Standardgrafik 4x4-Matrix in homogenen Koordinaten. Um den Bildschirm zu füllen, müssen Sie nur das Bild gleichmäßig skalieren, bis die schwarzen Balken verschwunden sind (beachten Sie, dass dadurch einige Bilddaten vom Bildschirm verschwinden). Dies ist aus dem Speicher, aber die Skalierungsmatrix ist nur [s 0 0 0; 0 s 0 0; 0 0 0 0; 0 0 0 1] wobei s der Vergrößerungsfaktor ist (also s = 2, für doppelte Größe). Multiplizieren Sie diese Matrix mit der Transformationsmatrix, die Sie von getTransform erhalten (Matrix multiply, nicht elementweise) und setzen Sie sie als transform mit setTransform. –

+0

Okay, ich habe die Methode matrix.setScale (x, y) verstanden. Ich werde dieses "multiplizieren Sie diese Matrix mit der Transformationsmatrix ..." ausprobieren - morgen Teil und sehen, ob ich es zur Arbeit bekomme. Ich bin nicht 100% sicher, was Sie damit meinen. Ich könnte dich vielleicht wieder treffen, vielen Dank bis jetzt! – Csharpest

4

Ich konnte das Problem beheben, indem ich setMeasuredDimension();

+0

Hallo Edmund, was meinst du mit "SwitchingMeasuredDimension()"? Ich habe das gleiche Problem mit Vollbild mit Kamera2. Können Sie den Code bereitstellen, den Sie in der onMeasure-Methode verwenden, um den vollständigen Bildschirm ohne Verzerrung zu erhalten? –

+0

Entschuldigung für die späte Antwort, ich habe meine Antwort aktualisiert –

+1

Danke für die aktualisierte Antwort, aber diese Lösung dehnt die Vorschau. – iMDroid

0

Ich lasse Sie unter dem Code, den wir verwendet haben, um eine Vorschau zu messen, die 4: 3, 16: 9 und 1: 1 Vorschaugrößen unterstützt. Die Höhe wird skaliert, da die App im Hochformat blockiert ist und nicht in Querformat gedreht wird.

Ich hoffe, es wird Ihnen oder jemand anderem mit dem gleichen Problem helfen!

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()); 

}