SurfaceView blinkt bei Belastung schwarz
Habe ich eine Zeichnung app, die in etwa 2-5 Sekunden zum laden der Zeichnung für komplizierte Zeichnungen (geschieht über einen AsyncTask
). Für eine bessere Benutzer-Erfahrung, während dieser Zeit habe ich flash die gespeicherte PNG-version von der Zeichnung habe ich aus dem app-Verzeichnis wie ein ImageView
und zeigen eine be - ProgressBar
aufrufen setContentView()
in der Aktivität Konstruktor:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/flash"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@color/note_bg_white"
android:contentDescription="@string/content_desc_flash_img"
android:focusable="false" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="6dp"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:gravity="bottom|center_vertical">
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:id="@+id/toolbar_progress"
android:layout_width="match_parent"
android:layout_height="18dp"
android:gravity="bottom|center_vertical" />
</RelativeLayout>
</FrameLayout>
Wenn die AsyncTask
ist abgeschlossen, ich rufen Sie dann setContentView()
wieder mit dem neuen layout:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
<com.my.package.DrawingCanvas
android:id="@+id/canvas"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:background="#ffffff" />
</RelativeLayout>
Wenn ich mit einem einfachen Canvas
Modell, das perfekt funktionierte, wie die benutzerdefinierte DrawingCanvas - View
ziehen würde die Zeichnung auf dem Bildschirm auf der ersten onDraw()
bevor Sie dem Benutzer angezeigt, aber jetzt mit der SurfaceView
mit einer Zeichnung loop, ich sehe das layout geflasht, dann, wenn die Zeichnung geladen ist, ein schwarzer Bildschirm für etwa eine Sekunde, dann endlich die neue DrawingCanvas.
Ich gehe davon aus, dass der Grund ist im Zusammenhang mit dem start-up-Zeit von der Zeichnung loop-thread, und ich habe meine diesen von onDraw()
im SurfaceView
und es wird genannt, aber die Leinwand erhältlich in onDraw()
scheint nicht zu ziehen, um die SurfaceView
. Ich habe auch versucht die Einstellung eine solide Farbe, hintergrund in der XML oben in der Hoffnung auf ein minimum zu zeigen einen weißen hintergrund, aber diejenigen, die scheinen nie zu dauern, beeinträchtigen, auch wenn es aus dem code.
Rat oder eine Erklärung was ich sehe mit dem schwarzen Bildschirm?
EDIT:
Ok, haben bestätigt, dass die onDraw() zeichnen des canvas, also Links mein zeichnen ops gab es auch in der Hoffnung, dass auf die erste Vorführung von SurfaceView, die der Benutzer sehen diese Zeichnungen wie in der regulären Leinwand-Umsetzung, und wenn die Zeichnung Faden gesponnen hatte, es würde überschreiben die Leinwand.
Allerdings, wenn ich klar die Zeichnung thread operations, sehe ich die onDraw () - Ergebnisse, aber wieder, NACH dem schwarzen Bildschirm blinken. Und wenn ich entfernen Sie die onDraw () - überschreibung vollständig, ich sehe immer noch den black flash und dann sehe ich das layout mit dem weißen hintergrund von XML.
So, es sieht aus wie, egal was, bin ich immer gehen, um zu sehen, der Bildschirm ist schwarz, außer vielleicht statt der Umstellung der layouts, die ich ändern Sie einfach die vorhandenen "flash" - layout, das bereits aktiv ist?
EDIT2:
Haben versucht, mit einer ViewStub so, ich kann Blasen die SurfaceView in den vorhandenen Anzeigen nach dem Hinweis geladen, aber das gleiche issu immer noch gilt. Als nahe als ich kann erzählen, es ist eine ansehnliche (~200ms) Verzögerung zwischen dem SurfaceView Konstruktor und Aufruf surfaceCreated() ausführen, aber nicht sicher, dass dies ist, wo der schwarze Bildschirm passiert, oder warum der Bildschirm gezeichnet wird schwarz...
EDIT3:
Mein letzten Versuch für heute schließt die SurfaceView transparent. Dies kombiniert mit dem verlassen der bestehende layout in platzieren und einfach das hinzufügen, um das layout über die ViewStub geführt hätte, eine funktionierende Lösung habe ich zwar nicht, aber dennoch, für ein Bruchteil einer Sekunde, wenn die SurfaceView ist laden blinkt der Bildschirm schwarz, bevor die SurfaceView wird gezeigt, wie transparent. Wenn jemand noch andere Ideen zu versuchen, bitte posten.
InformationsquelleAutor der Frage Paul Mennega | 2012-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube ich habe den Grund für den schwarzen Blitz. In meinem Fall bin ich mit einer SurfaceView innen ein Fragment und dynamisch hinzufügen dieses fragment zu den Tätigkeiten, die nach ein bisschen action. Der moment, wenn ich das fragment auf die Aktivität, der Bildschirm blinkt schwarz. Ich habe grepcode für die SurfaceView Quelle und hier ist was ich gefunden habe: wenn die Oberfläche Ansicht " in dem Fenster erscheint der allerersten Zeit, fordert er das Fenster Parameter ändern, indem Sie eine private
IWindowSession.relayout(..)
Methode. Diese Methode "gibt" Ihnen einen neuen Rahmen, Fenster und Fenster-Oberfläche. Ich denke, der Bildschirm blinkt genau in diesem moment.Die Lösung ist ziemlich simpel: wenn Ihr Fenster hat bereits entsprechende Parameter wird nicht aktualisiert, alle Fenster Zeug und der Bildschirm wird nicht blinken. Die einfachste Lösung ist das hinzufügen einer
0px
Höhe plain SurfaceView auf das erste layout Ihrer Tätigkeit. Dieses wird neu das Fenster, bevor der Vorgang wird auf dem Bildschirm angezeigt, und wenn Sie Ihren zweiten layout, es wird einfach weiter mit dem Fenster mit den aktuellen Parametern. Ich hoffe, das hilft.UPDATE: Sieht aus wie nach Jahren dieses Verhalten ist immer noch da. Ich würde empfehlen, TextureView statt SurfaceView. Dies ist buchstäblich eine neuere Implementierung derselben Sache, die nicht über diese Nebenwirkung, wie auch don ' T haben ein problem mit schwarzen hintergrund, wenn Sie sich bewegen (zum Beispiel im ScrollView, ViewPager, RecyclerView etc).
InformationsquelleAutor der Antwort Evos
Ich würde dies nicht mit zwei getrennten layouts.
Versuchen, Ihre root-element ein RelativeLayout und dann mit der SurfaceView und Bildansicht werden Geschwister-Kinder. Was passiert mit Ihren threading etc, die Bildansicht gezogen werden sollte, ganz undurchsichtig, die oben auf dem SurfaceView, so dass Sie nicht bekommen, eine flash.
Einmal Ihren worker-thread geladen hat, der Zeichnung und der SurfaceView zeichnen kann, die sich, entfernen Sie die Fortschritt-bar und Bildansicht aus der view-Hierarchie.
InformationsquelleAutor der Antwort Reuben Scratton
Ich gehe davon aus, dass Sie gerade zeichnen, einige schwere-code in Ihre Oberfläche anzeigen, weil so weit ich weiß, wird das Oberfläche-Ansicht zeigt die komplette Sicht nach Zeichnung alles eine Zeit. Ich schlage vor, Sie gehen zunächst auf die onDraw () - Methode der Oberflächen-Ansicht legen Sie dann die hintergrund-der Leinwand-dann rufen Sie gewaltsam zu entkräften, um zu vermeiden, dass der Bildschirm ist schwarz. Eine Bedingung hinzufügen, um sicher zu sein, dass diese gewaltsam zu entkräften ist nur einmal aufgerufen.
InformationsquelleAutor der Antwort Tofeeq
Müssen Sie sicherstellen, dass onSurfaceChanged() nicht zurück, bis Sie vollständig gezeichnet und geschrieben den Inhalt der SurfaceView die Oberfläche.
InformationsquelleAutor der Antwort hackbod
Wenn Sie NavigationDrawer mit Fragmenten, als der Evos-Lösung wird nicht funktionieren!
Versuchen NavigationDrawer mit Aktivitäten anstelle von Fragmenten, dies wird Ihnen helfen, 100%
Wie die Umsetzung NavDrawer mit Aktivitäten: link
Ein weiteres hilfreiches link. (im Falle von SurfaceView zeichnen auf der Oberseite des SlidingMenu)
InformationsquelleAutor der Antwort Valentin Baryshev
" die Leinwand erhältlich in onDraw() scheint nicht zu ziehen, um die SurfaceView"
- Sind Sie sicher, dass Sie nicht erstellen Sie die zweite (oder Dritte...) Instanz von Surface View? Und einige von Ihnen könnte schwarz sein und gezeigt werden, für eine Sekunde. Ich sehe nicht den code hier so ist, kann ich nicht sagen, sicherlich, aber wenn es meine Bewerbung wäre, würde ich prüfen, ob diese Fehler auf den ersten.
InformationsquelleAutor der Antwort Gangnus
Ich vor dem gleichen Problem, aber danke für diese Antwort
InformationsquelleAutor der Antwort tej shah
CrazyOrr Lösung für mich gearbeitet, aber es war tief in den Kommentaren für die top-Antwort von Evos, also hier ist es wieder:
Einfach, indem ich
in der Aktivität
onCreate()
für mich gearbeitet.InformationsquelleAutor der Antwort Björn Kechel