Ho un'app di disegno che impiega circa 2-5 secondi per caricare il disegno per disegni complicati (fatto tramite un AsyncTask
). Per una migliore esperienza utente, in questo periodo I flash la versione PNG memorizzato del disegno che ho dalla cartella app come ImageView
, e mostrare un carico ProgressBar
chiamando setContentView()
nel costruttore di attività:SurfaceView lampeggia nero sul carico
<?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>
Quando il AsyncTask
è completo, ho poi chiamo setContentView()
di nuovo con il nuovo 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>
quando stavo usando un semplice modello Canvas
, questo ha funzionato perfettamente, come il costume DrawingCanvas View
richiama il disegno per il ghiaione n sull'iniziale onDraw()
prima di essere mostrato all'utente, ma ora usando lo SurfaceView
con un ciclo di disegno, vedo il layout lampeggiante, quindi quando il disegno è caricato, una schermata nera per circa un secondo, infine il nuovo DrawingCanvas.
Io parto dal presupposto che il motivo è legato al tempo di avvio del filo ciclo disegno, e ho lasciato il mio overide del onDraw()
nel SurfaceView
, e viene chiamato, ma la tela disponibile in onDraw()
non lo fa sembra attrarre allo SurfaceView
. Ho anche provato a impostare uno sfondo a tinta unita nell'XML di cui sopra, sperando almeno di mostrare uno sfondo bianco, ma quelli non sembrano mai avere effetto, nemmeno impostandolo dal codice.
Qualche consiglio o spiegazione di ciò che vedo sullo schermo nero?
EDIT:
Ok, hanno confermato che OnDraw() sta volgendo al stessa tela, così lasciato le mie ops disegnare in là pure sperando che sulla tappa iniziale del SurfaceView, l'utente vedrebbe quei disegni come nella normale implementazione Canvas, e quando il thread del disegno è stato ruotato, sovrascrive la tela.
Tuttavia, se cancello le operazioni del disegno, vedo i risultati di onDraw(), ma ancora, DOPO lo schermo nero lampeggiano. E se rimuovo completamente l'onDraw(), vedo ancora il flash nero e poi vedo il layout con lo sfondo bianco dell'XML.
Quindi, a prescindere da cosa, vedrò sempre lo schermo nero, a meno che forse invece di cambiare il layout, semplicemente modifico il layout 'flash' esistente che è già attivo?
EDIT2:
provato con un ViewStub in modo che possa gonfiare il SurfaceView nella vista esistente dopo la nota è stato caricato, ma lo stesso si applica issu ancora. Per quanto posso dire, c'è un ritardo considerevole (~ 200ms) tra il costruttore di SurfaceView e la chiamata a surfaceCreated() in esecuzione, ma non è sicuro che questo sia il punto in cui lo schermo nero sta accadendo, o perché lo schermo sia disegnato per nero ...
Edit3:
mio ultimo tentativo per ora include anche l'SurfaceView transparent. Questo combinato con l'abbandono del layout esistente e l'aggiunta semplicemente a quel layout tramite ViewStub avrebbe comportato una soluzione operativa, sebbene, tuttavia, per una frazione di secondo quando il SurfaceView viene caricato lo schermo diventa nero prima che venga visualizzato SurfaceView, come trasparente. Se qualcuno ha altre idee da provare, per favore pubblicale.
Alcune operazioni pesanti su onCreate potrebbero dare risultati simili. – Ronnie
Mostriamo il layout 'flash' in onCreate(), nessun ritardo lì. Lo schermo ritardo/nero arriva una volta che il disegno è stato caricato e avvio SurfaceView, che implica solo l'avvio del thread. –
Possiamo vedere l'origine della classe DrawingCanvas? –