SurfaceView clignote en noir sur la charge

J'ai une application de dessin qui prend environ 2 à 5 secondes pour charger le dessin compliqué dessins (fait par l'intermédiaire d'un AsyncTask). Pour une meilleure expérience utilisateur, pendant ce temps je flash la stockées PNG version du dessin que j'ai depuis le répertoire app comme un ImageView, et de montrer un chargement ProgressBar appel setContentView() dans l'Activité de constructeur:

<?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>

Lorsque le AsyncTask est terminé, je puis appeler setContentView() à nouveau avec la nouvelle mise en page:

<?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>

Quand j'étais à l'aide d'un simple Canvas modèle, cela a fonctionné parfaitement, comme c'est la coutume DrawingCanvas View voudrais attirer le dessin à l'écran sur la première onDraw() avant d'être présentée à l'utilisateur, mais maintenant, à l'aide de la SurfaceView avec un dessin de la boucle, je vois l'flashé mise en page, puis lorsque le dessin est chargé, un écran noir pendant environ une seconde, puis, enfin, la nouvelle DrawingCanvas.

Je suis en supposant que la raison est liée à la durée de démarrage du dessin de la boucle de fil, et j'ai laissé mon annuler de onDraw() dans le SurfaceView, et elle est appelée, mais la toile disponible en onDraw() ne semblent pas tirer à la SurfaceView. J'ai aussi essayé de fixer un solide arrière-plan de couleur dans le fichier XML ci-dessus en espérant au minimum pour afficher un fond blanc, mais ceux qui semblent ne jamais prendre effet, même en mettant de code.

Tout conseil ou une explication de ce que je vois avec l'écran noir?

EDIT:

Ok, ont confirmé que onDraw() est le dessin de la toile même, donc quitté mon tirage ops là en espérant que sur la première affiche de la SurfaceView, l'utilisateur devrait voir ces dessins comme dans l'ordinaire de la Toile de mise en œuvre, et lorsque le dessin fil avait lancé, il serait de remplacer la Toile.

Cependant, si j'ai effacer le dessin fil des opérations, je vois le onDraw() résultats, mais encore une fois, APRÈS l'écran noir flash. Et si je supprime le onDraw() remplacer complètement, je persiste à voir dans le noir flash et puis je vois la mise en page avec le fond blanc de l'XML.

Ainsi, il ressemble à n'importe quoi, je vais toujours voir l'écran noir, sauf peut-être au lieu de passer les mises en page, j'ai simplement modifier l'existant 'flash' de mise en page qui est déjà actif?

EDIT2:

Ont essayé d'utiliser un ViewStub afin que je puisse gonfler le SurfaceView dans la Vue existante après la note est chargé, mais le même issu s'applique toujours. Aussi loin que je peux dire, il y a une importante (~200 ms) délai entre la SurfaceView constructeur et l'appel à surfaceCreated() en cours d'exécution, mais vous ne savez pas que c'est là que l'écran noir qui se passe, ou pourquoi l'écran est en cours d'élaboration pour le noir...

EDIT3:

Ma dernière tentative pour l'instant inclut la fabrication SurfaceView transparent. Ceci, combiné avec la sortie de la mise en place et de simplement ajouter à cette mise en page via le ViewStub aurait abouti à une solution de travail, je l'ai bien, mais encore, pour une fraction de seconde lorsque le SurfaceView est le chargement de l'écran clignote en noir avant la SurfaceView est montré, comme transparent. Si quelqu'un a d'autres idées à essayer, merci de les poster.

  • Certaines opérations lourdes dans le onCreate pouvait donner de tels résultats.
  • Je montre le 'flash' de mise en page dans onCreate(), aucun retard n'. Retard/écran noir vient une fois que le dessin est chargé et je commence le SurfaceView, ce qui implique de départ thread.
  • Pouvons-nous voir la source pour votre classe DrawingCanvas?
  • Malheureusement non, je ne peux pas poster autre chose que de petits fragments en raison de restrictions légales.
InformationsquelleAutor Paul Mennega | 2012-01-07