2011-01-28 2 views
1

Je développe une activité peu OpenGL, il est composé par cette mise en page:GLSurfaceView OnPause montre seulement un écran noir

<RelativeLayout 
       android:id="@+id/vt_layout_opengl" 
       android:orientation="horizontal" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:visibility="gone" 


     > 

      <android.opengl.GLSurfaceView 
        android:id="@+id/surface_vt" 
        android:layout_width="900dp" 
        android:layout_height="285dp" 

      /> 

      <RelativeLayout 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:layout_below="@id/surface_vt" 
        android:layout_marginTop="5dp" 
        android:background="@drawable/barra_menu_vt" 

        > 

        <ImageButton android:id="@+id/vt_left_arrow" 
           android:layout_width="wrap_content" 
           android:layout_height="wrap_content" 
           android:layout_alignParentLeft="true" 
           android:layout_marginLeft="20dp" 
           android:background="@drawable/prev_a" 
           android:onClick="prec" 

        /> 
        <ImageButton android:id="@+id/vt_right_arrow" 
           android:layout_width="wrap_content" 
           android:layout_height="wrap_content" 
           android:background="@drawable/next_a" 
           android:layout_toRightOf="@+id/vt_left_arrow" 
           android:layout_marginLeft="20dp" 
           android:onClick="next" 
        /> 
        <TextView 
         android:id="@+id/vt_description" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_toRightOf="@+id/vt_right_arrow" 
         android:layout_marginLeft="30dp" 
         android:maxLength="30" 
         android:singleLine="true" 
         android:ellipsize="marquee" 
        /> 

        <ImageButton android:id="@+id/vt_information" 
           android:layout_width="wrap_content" 
           android:layout_height="wrap_content" 
           android:layout_toLeftOf="@+id/vt_addbookmarks" 
           android:layout_marginRight="20dp" 
           android:background="@drawable/info_a" 
           android:onClick="info" 

        /> 
        <ImageButton android:id="@+id/vt_addbookmarks" 
           android:layout_width="wrap_content" 
           android:layout_height="wrap_content" 
           android:layout_toLeftOf="@+id/vt_preferences" 
           android:layout_marginRight="20dp" 
           android:background="@drawable/book_a" 
           android:onClick="bookmark" 
        /> 
        <ImageButton android:id="@+id/vt_preferences" 
           android:layout_width="wrap_content" 
           android:layout_height="wrap_content" 
           android:layout_alignParentRight="true" 
           android:layout_marginRight="20dp" 
           android:background="@drawable/sett_a" 
           android:onClick="settings" 
        /> 




       </RelativeLayout> 


     </RelativeLayout> 

Il est montre une vue comme ceci:

enter image description here

Mais quand je appuyez sur le bouton d'accueil et je reviens sur mon application je ne vois qu'un écran noir, le GLSurfaceView et aussi le RelativeLayout ne sont pas affichés !!

Après environ deux système minuts disent: enter image description here

Je suis très frustrant, je l'appelle GLSurface OnPause() et onResume() lorsque mon activité appelle les méthodes correspondantes.

Quelqu'un peut m'aider !! ????

je poste une partie de mon code:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    Log.d(TAG,"onCreate()"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.virtualtour); 
     loading_ly = (RelativeLayout) findViewById(R.id.vt_layout_loading); 
     panorama_description = (TextView) findViewById(R.id.vt_description); 
     virtualtour_relatively = (RelativeLayout) findViewById(R.id.vt_layout_opengl); 
     vt_handler = new VirtualTourHandler(this); 
     ext_container = new GLExtensionContainer(); 
     th_checkGL = new ThreadCheckOpenGL(ext_container, extensions_requested,vt_handler); 
     th_checkGL.start(); 
     mFacebook = new Facebook(ArounderTouchMainActivity.APP_ID); 
     mAsyncRunner = new AsyncFacebookRunner(mFacebook); 
     msg = vt_handler.obtainMessage(); 
     output_thread = msg.getData(); 
     output_thread.putInt(VirtualTour.TYPE_TAG, VirtualTour.START_TAG); 
     vt_handler.handleMessage(msg); 
     } 

Ceci est mon gestionnaire de classe interne (je l'utilise pour la texture du commutateur lorsque les utilisateurs effectuent une action)

@Override 
     public void handleMessage(Message msg) { 


      bd = msg.getData(); 
      type = bd.getInt(TYPE_TAG); 
      bd = msg.getData(); 

      switch (type) { 
       case GL_EXTENSIONS_CHECK_TAG: 
        showDialog(GL_EXTENSIONS_CHECK_DIALOG); 
        break; 
       case START_TAG: 
        Log.d(TAG, "START_TAG"); 
        loading_ly.setVisibility(View.VISIBLE); 
        virtualtour_relatively.setVisibility(View.GONE); 
        progress_bar.setProgress(0); 
        thread = new DownloadImageProgressBar(vt_handler,getActivity()); 
        thread.execute(panorama_input.get(position).getUrl_virtual()); 
        break; 
       case BAR_TAG: 
        progress = bd.getInt(PROGRESS_TAG); 
        if(progress <= 100) 
         progress_bar.setProgress(progress); 
        break; 

       case SHUTDOWN_TAG: 
        finish(); 
        break; 
       case SHOW_TAG: 
       Log.d(TAG, "SHOW_TAG"); 
       if(first_visualization){ 
        glSurface = (GLSurfaceView) findViewById(R.id.surface_vt); 
        glSurface.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR); 
        renderer = new OpenGLRenderer(first_data,second_data,sphere,vt_handler,ext_container, ((panorama_input.get(position)).getType().compareTo(CardImage.SPHERE) == 0)); 
        glSurface.setRenderer(renderer); 
        first_visualization = false; 
       } 
       // potrebbe essere fatto molto meglio: ricorda! 
       panorama_description.setText(panorama_input.get(position).getTitolo()); 
       loading_ly.setVisibility(View.GONE); 
       virtualtour_relatively.setVisibility(View.VISIBLE); 

       renderer.setImage(first_data, second_data,((panorama_input.get(position)).getType().compareTo(CardImage.SPHERE) == 0)); 
       renderer.resetZoom(); 
       renderer.resetAngle(); 
       renderer.startTimer(); 
       enable_touch = false; 
       case NOCONNECTION_ERROR_TAG: 
        showDialog(OUTOFMEMORY_ERROR_DIALOG); 
        break; 

       case OUTOFMEMORY_ERROR_TAG: 
        showDialog(OUTOFMEMORY_ERROR_DIALOG); 
        break; 


       default: 
        break; 
      } 
      return; 

     } 


    } 

Le DownloadImageProgressBar est un AsyncTask qui télécharge des images à partir du Web et effectue certaines actions de l'interface utilisateur via le gestionnaire d'activités.

Il y a mes méthodes OnPause et onResume:

@Override 
protected void onResume() { 
    Log.d(TAG,"onResume()"); 
    super.onResume(); 
    if(glSurface != null) 
     glSurface.onResume(); 
} 

    @Override 
protected void onPause() { 
    Log.d(TAG,"onPause()"); 
    super.onPause(); 
    glSurface.onPause(); 
} 

j'appelle ces méthodes dans onSurfaceChanged et onSurfaceCreated:

public void setGLTexture(GL10 gl10) { 

     GL11 gl = (GL11) gl10; 

     //Generate one texture pointer... 
     gl.glGenTextures(2, textures_id); 
     gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f); 
     //...and bind it to our array 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures_id.get(0)); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, first, 0); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures_id.get(1)); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, second, 0); 
     return; 
    } 

J'ai une autre question, quand mon commutateur d'activité en arrière-plan les images de textures I téléchargé avant sont supprimés?

Il est possible que ce soit les problèmes?

+0

pouvez-vous poster du code (résumé) afin que nous comprenions ce que vous faites quand l'activité redémarre? –

Répondre

5

Lorsque vous appuyez sur 'home', le contexte GL est perdu.

De la documentation Android:

Il y a des situations où le contexte de rendu EGL sera perdu. Ce se produit généralement lorsque l'appareil se réveille après s'être endormi. Lorsque le contexte EGL est perdu, toutes les ressources OpenGL (telles que les textures) associées avec ce contexte seront automatiquement supprimées. Afin de garder le rendu correctement, un moteur de rendu doit recréer toutes les ressources perdues dont il a encore besoin . La méthode onSurfaceCreated (GL10, EGLConfig) est un endroit pratique pour faire cela.

Vous pouvez lire à ce sujet here.

Pour résoudre le problème, exécutez toute la texture OpenGL et l'initialisation dans onSurfaceChanged de votre moteur de rendu.

+0

Mais pourquoi je n'ai rien vu ... Si vous avez raison je ne pouvais pas voir seulement le GLSurfaceView. Je vais essayer de toute façon de cette façon maintenant et je vais montrer le résultat. Merci – pedr0

+0

Bien sûr, il a raison. J'ai écrit presque la même réponse mais il est arrivé 30 secondes avant moi. :) –

+0

Mais le document android dit: onSurfaceCreated (GL10, EGLConfig) et vous dites: onSurfaceChanged, ce qui est de ces deux méthodes est-ce exact? – pedr0