Zeigen Sie mein Layout, während SurfaceView die Kameravorschau lädt

7

Ich habe einen einfachen Bildschirm mit einem Startknopf. Wenn die Start-Taste gedrückt wird, möchte ich mit einer SurfaceView zu einem neuen Bildschirm gehen, um die Kamera anzuzeigen.

Alles funktioniert gut, aber die Kamera braucht eine Weile, um zu laden, und das gibt mir einen schwarzen Bildschirm. Ich möchte, dass das neue Layout geladen wird. Und dann die Kamera starten, nachdem sie geladen wurde ...

Dafür lade ich alle Camera in einen Hintergrund-Thread, aber trotzdem bekomme ich einen schwarzen Bildschirm ... Hier ist mein Layout:

%Vor%

Hier ist die Methode aus meiner Aktivität, die die neue Ansicht lädt:

%Vor%

Wie kommt es, dass das neue Layout nicht angezeigt wird, bis der Thread die Kamera geladen hat?

EDIT: Ich habe Thread.sleep (200) innerhalb des Threads versucht, für einige Zeit zu schlafen ... Wenn ich das tue, wird das neue Layout sofort angezeigt, aber die Kamera startet nie ...

    
Entreco 19.08.2011, 08:53
quelle

1 Antwort

20

Das Problem ist, dass ich mein SurfaceView im XML-Layout verwendet habe. Sobald Sie anrufen: setContentView (your_layout) - & gt; Die XML-Datei ist aufgebläht. Das heißt, das SurfaceView ist ebenfalls aufgebläht. Das bedeutet wiederum, dass die SurfaceView onSurfaceCreated-Methode aufgerufen wird, die das Öffnen der Kamera usw. auslöst.

Der gesamte Vorgang dauert also eine Weile, daher scheint Ihre vorherige Aktivität (z. B. diejenige, die die Aktivität mit der SurfaceView startet) nicht mehr zu reagieren ...

Meine Lösung, die CameraView in einem BG-Thread zu erstellen, löst die Unempfindlichkeit. Aber die Ausgabe der Kamera in der SurfaceView konnte nicht angezeigt werden.

Die Lösung besteht darin, Ihr SurfaceView aus Ihrem XML-Dokument zu entfernen. Dadurch wird Ihre Aktivität sofort gestartet (da SurfaceView und Kamera nicht instanziiert sind). Sobald das neue Activities-Layout geladen ist, können Sie programmatisch ein neues SurfaceView zu Ihrem Bildschirm hinzufügen. Natürlich braucht das auch Zeit, aber Ihre Benutzeroberfläche wechselt schnell zu der neuen Aktivität und Sie können einen Loader anzeigen, während die Oberfläche und die Kamera geladen werden!

SO: Entfernen Sie die SurfaceView von der XML - & gt; PROGRAMMISCH HINZUFÜGEN: Aktivität starten:

%Vor%

Main.xml (nur eine Schaltfläche zum Starten der neuen Aktivität)

%Vor%

Hier ist die zweite Aktivität (die die SurfaceView enthält)

%Vor%

Und hier ist das Layout der zweiten Aktivität (OHNE EINE OBERFLÄCHENVIEW)

%Vor%

Schließlich, um die Antwort zu vervollständigen, ist hier der Code für die CameraView (). Es ist wirklich nur eine einfache Implementierung, um die Kamera zu öffnen und den Inhalt anzuzeigen:

%Vor%     
Entreco 15.11.2011, 11:21
quelle