Kamera setDisplayOrientation() im Portrait-Modus Bricht Seitenverhältnis
Ich versuche, Kamera-Vorschau zu arbeiten, richtig im portrait-Modus, wo die Tätigkeit selbst ist erlaubt, ändern Sie die Ausrichtung in der Regel (d.h., nicht gesperrt werden, um Landschaft).
Den Einsatz von setDisplayOrientation()
ernst bricht das Verhalten der Vorschau, aber.
Diese können nachgewiesen werden durch die Google-eigenen ApiDemos. Das erste Bild basiert auf der CameraPreview
von der android-17
Ausgabe des ApiDemos
Beispiel-Projekt, wo die einzige änderung, die ich gemacht wurde, zu entfernen android:orientation="landscape"
aus dieser Tätigkeit den Eintrag im manifest. Das folgende Bild ist ein screenshot von dem, was erscheint auf dem display ein Nexus 4, mit Android 4.2, mit der Kamera zeigte auf eine 8,5" Quadrat Papier:
Was nicht eindeutig aus, die Vorschau ist, dass es um 90 ° gedreht ist. Der Strumpf gekleidete Füße, die Sie sehen, auf der rechten Seite des Bildes waren tatsächlich unten auf den Platz.
Die Lösung für dieses, zumindest für landscape-Modus ist die Verwendung setDisplayOrientation()
. Aber, wenn Sie ändern die Preview
innere Klasse CameraPreview
zu haben mCamera.setDisplayOrientation(90);
erhalten Sie:
Allem, der Platz ist nicht mehr Platz.
Dieser verwendet die gleichen SurfaceView
Größe wie vor. Ich habe reproduziert in diesem Szenario mit einigen anderen Codes auch außerhalb von ApiDemos
und ich bekomme das gleiche Verhalten mit TextureView
im code.
Dachte ich kurz, dass das Problem könnte sein, dass getSupportedPreviewSizes()
vielleicht zurück, andere Werte auf der Grundlage setDisplayOrientation()
aber ein kurzer test zeigt, dass dies nicht der Fall ist.
Jemand eine Idee, wie man setDisplayOrientation()
arbeiten im portrait-Modus ohne Zerstörung das Seitenverhältnis der Bilder über geschoben, um die Vorschau?
Dank!
InformationsquelleAutor der Frage CommonsWare | 2013-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK, ich denke, ich habe dies aus. Es gab ein paar Stücke, um die sprichwörtliche puzzle, und ich danke @kcoppock für die Einsicht, dass half mir lösen einige dieser.
Erste, Sie brauchen, um die Orientierung zu berücksichtigen, wenn die Bestimmung, welche Größe der Vorschau zu wählen. Zum Beispiel, die
getOptimalPreviewSize()
von derCameraPreview
vonApiDemos
ist im Bezug auf Ausrichtung, einfach weil Ihre version der app hat die Orientierung gesperrt Landschaft. Wenn Sie möchten, lassen Sie die Ausrichtung schweben, Sie müssen umkehren, das Ziel-Seitenverhältnis übereinstimmen. Also, wogetOptimalPreviewSize()
hat:müssen Sie auch:
wo
displayOrientation
ist ein Wert von 0 bis 360, , ich bin die Bestimmung von über 100 Zeilen einige ernst hässlichen code, das ist, warum ich bin, wickeln Sie alle diese in eine wiederverwendbare Komponente, die werde ich in Kürze veröffentlichen. Dieser code basiert auf diesetDisplayOrientation()
JavaDocs und diese StackOverflow-Antwort.(BTW, wenn Sie dies Lesen, nach dem 1. Juli 2013, und Sie nicht sehen, einen link in dieser Antwort auf, die Komponente, die einen Kommentar posten, um mich daran zu erinnern, wie ich vergessen)
Zweite, die Sie benötigen, zu nehmen, die display-Ausrichtung berücksichtigt werden, wenn die Steuerung das Seitenverhältnis des
SurfaceView
/TextureView
die Sie verwenden. DieCameraPreview
Aktivität vonApiDemos
hat seine eigenePreview
ViewGroup
für das Seitenverhältnis, und dort müssen Sie umkehren, das Seitenverhältnis für die Verwendung im portrait:wo
displayOrientation
ist, denselben Wert (90
und270
als portrait-und reverse-portrait beziehungsweise, und beachten Sie, dass ich habe nicht versucht, erste Rückseite-portrait oder reverse-Landschaft zu arbeiten, so dass es möglicherweise weitere Optimierungen erforderlich).Dritte-und eine, finde ich ärgerlich-Sie müssen starten Sie die Vorschau vor dem Aufruf
setPictureSize()
auf dieCamera.Parameters
. Ansonsten, es ist, als wenn das Seitenverhältnis des Bild angewendet wird, um die Vorschau-frames, Schrauben Dinge.So, ich verwendet, um code ähnlich dem folgenden:
- und das ist falsch. Was Sie wirklich brauchen, ist:
Ohne dass eine Veränderung, die ich bekommen würde, eine gestreckte Seitenverhältnis, auch in der Landschaft. Dies war kein problem für
CameraPreview
vonApiDemos
als waren Sie nicht fotografieren, und so Sie nie angerufensetPictureSize()
.Aber, so weit, auf einem Nexus 4, ich habe jetzt quadratischem Seitenverhältnis für hoch-und Querformat, mit variabler Ausrichtung (D. H., nicht gesperrt zu Landschaft).
Ich werde versuchen, denken Sie daran, dies zu ändern Frage, wenn ich andere hacks von anderen Geräten, plus link zu meiner
CameraView
/CameraFragment
Komponenten, wenn Sie losgelassen werden.UPDATE #1
Gut, natürlich, es könnte nicht vielleicht durch fast diese einfach. 🙂
Den fix für das problem, wo
setPictureSize()
Schrauben bis das Seitenverhältnis funktioniert... bis Sie ein Bild aufnehmen. An diesem Punkt, die Vorschau schaltet auf den falschen Seitenverhältnis.Eine Möglichkeit wäre die Grenze Bilder, um diejenigen, die mit dem gleichen (oder sehr nahe) - Seitenverhältnis der Vorschau, also der Schluckauf ist nicht vorhanden. Ich mag das nicht beantworten, da die Benutzer sollten in der Lage sein, um unabhängig von Bildgröße die Kamera bietet.
Begrenzen Sie den Umfang der Schäden durch:
Camera.Parameters
nur vor der AufnahmeCamera.Parameters
nach der Aufnahme des BildesDiese weiterhin präsentiert das falsche Seitenverhältnis in den Momenten, während das Bild aufgenommen wird. Die langfristige Lösung für dieses-ich glaube-werden, um vorübergehend ersetzen Sie die Kamera-Vorschau mit einem Standbild (die letzten Vorschau-frame), während das Bild aufgenommen wird. Ich werde versuchen, dieses schließlich.
UPDATE #2: v0.0.1 meine CWAC-Kamera-Bibliothek ist jetzt verfügbar, mit dem oben genannten code.
InformationsquelleAutor der Antwort CommonsWare
Ok Jungs,
ich war wirklich verrückt in den letzten zwei Wochen über diese f*** problem.
okay, einige Dinge zu wissen:
änderungen von @CommonsWare sind einfach perfekt, aber nicht direkt angewendet werden, um die CameraPreview von API Level 8 Proben (link unten), so ist hier die diff:
für korrekte Seitenverhältnis im hochformat machen:
Methoden sind die gleichen, nur für die diff
in:
ändern:
:
in:
ändern:
:
endlich beginnen-Kamera für portrait-Modus mit etwas wie:
WUUHUUUU!
Für mich abschließend noch Probleme in der Vorschau, und keine Probleme beim speichern von Bildern.
Weil mein Ort der Tätigkeit gesperrt ist, bekomme ich die display-Ausrichtung per OrientationChangedListener zum speichern von Bildern mit der richtigen Orientierung.
etwas wie:
http://www.androidzeitgeist.com/2013/01/fixing-rotation-camera-picture.html
Aber Sie werden richtig in der Vorschau angezeigt und gespeichert.
Ich hoffe, ich kann vielen Menschen helfen, mit, dass, es ist die original code aus der API-Level 8:
https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java
wo die änderungen vorgenommen wurden.
InformationsquelleAutor der Antwort cV2
Bitte ändern Sie die Ausrichtung der Kamera auf den code und Sie sollten
setDisplayorientation()
nichtgetDisplayOrientation()
InformationsquelleAutor der Antwort surendran prabhakaran