2010-09-29 9 views
9

Sto implementando un'applicazione abbastanza standard con il sdk Android che implica il disegno utilizzando SurfaceView, SurfaceHolder, configurazione Callback.Android SurfaceHolder.unlockCanvasAndPost() non causa il ridisegno

Nel mio thread principale (thread UI) non ho disegno o gestione di SurfaceHolder (o della tela che si recupera con esso).

In un thread separato ho il seguente:

Log.i("GAME.DrawThread", "run()"); 
     Log.i("GAME.DrawThread", Thread.currentThread().getName()); 
     Canvas canvas = null; 
     try { 
      canvas = holder.lockCanvas(); 
      synchronized(holder) { 
       Log.i("GAME", "draw():synchronized"); 
       Paint paint = new Paint(); 
       paint.setColor(R.color.draw_color); 
       canvas.drawColor(R.color.draw_color); 
       canvas.drawLine(0, 0, 500, 500, paint); 
      } 
     } catch (SurfaceHolder.BadSurfaceTypeException e) { 
      Log.e("GAME", "onDraw(): BadSurfaceTypeException"); 
     } finally { 
      if (canvas != null) { 
       holder.unlockCanvasAndPost(canvas); 
      } 
     } 

viene eseguito questo codice, getta senza eccezioni, e non ha effetti collaterali negativi che posso trovare; tuttavia, la chiamata unlockCanvasAndPost() non causa mai la chiamata a onDraw().

In altre parole, unlockCanvasAndPost() non causa un ridisegno di SurfaceView.

Qualche idea su cosa potrebbe causare questo sintomo? Ho un sacco di esperienza java, una buona dose di esperienza Android, e un sacco di esperienza di debug e non riesco a rintracciare questo.

Grazie in anticipo.

+0

Questo codice ora si blocca su Android 4.3 –

risposta

0

Non è così che funziona SurfaceView. La chiamata a unlockCanvasAndPost() non richiama onDraw(), che è l'intero punto di utilizzo di SurfaceView. La superficie di SurfaceView vive in una finestra diversa.

+1

Grazie, ma questo non risolve il problema. Qualunque meccanismo utilizzato per pubblicare la tela che scrivi sullo schermo non viene invocato. – cblades

+2

Non si spiega quale sia il problema. Come non funziona? –

+0

Sì Romain Guy, per favore aiutaci a risolvere questo enigma: p –

10

Quindi, quando si utilizza SurfaceView si disegna su una superficie che si trova al di sotto di una finestra. Stavo impostando il colore di sfondo della vista in xml; si scopre che imposta il colore di sfondo della finestra, non della superficie. In effetti, ho reso la finestra opaca in modo tale da non poter vedere la superficie sottostante.

Lezione appresa.

+0

Wow, grazie per il seguito! Ho avuto lo stesso problema e non so quanto tempo ci sarebbe voluto per trovarlo. Ho passato alcune ore prima di trovare la soluzione qui. Ugh. – spartygw

+0

Ho passato ore a cercare una risposta perché il 'unlockCanvasAndPost()' non aggiornava lo schermo nonostante tutti i metodi di disegno siano stati eseguiti ... Alla fine ho trovato la tua risposta e ho capito che era il mio pari problema, stavo impostando uno sfondo nero per la vista e il surfaceview stava disegnando sotto di esso .. Sono quasi diventato matto già: P – JorgeGRC

0

Questo è vecchio, ma ho la sensazione che il problema è che non vi è alcun richiamo di superficie. Stava cercando di disegnare sulla superficie prima che fosse creata la superficie

Problemi correlati