2010-09-29 8 views
9

Estoy implementando una aplicación bastante estándar con el sdk de Android que implica dibujar usando la configuración SurfaceView, SurfaceHolder, Callback.Android SurfaceHolder.unlockCanvasAndPost() no causa el redibujado

En mi hilo principal (hilo UI) no tengo dibujo ni manejo del SurfaceHolder (o del lienzo que recuperas con él).

En un hilo separado Tengo el siguiente:

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); 
      } 
     } 

está siendo ejecutado este código, los tiros no hay excepciones, y no tiene efectos secundarios negativos que puedo encontrar; sin embargo, la llamada a unlockCanvasAndPost() nunca hace que se llame a onDraw().

En otras palabras, unlockCanvasAndPost() no causa un redibujado de SurfaceView.

¿Alguna idea de lo que podría causar este síntoma? Tengo mucha experiencia en java, una buena cantidad de experiencia en Android y mucha experiencia en depuración y no puedo rastrear esta.

Gracias de antemano.

+0

Este código ahora se cuelga en Android 4.3 –

Respuesta

0

No es así como funciona SurfaceView. Llamar a unlockCanvasAndPost() no invoca onDraw(), ese es el objetivo de usar SurfaceView. La superficie de SurfaceView vive en una ventana diferente.

+1

Gracias, pero eso no resuelve el problema. No se invoca el mecanismo que se utiliza para publicar el lienzo en el que escribe en la pantalla. – cblades

+2

No explica cuál es el problema. ¿Cómo no está funcionando? –

+0

Sí Romain Guy por favor ayúdenos a resolver este enigma: p –

10

Por lo tanto, al utilizar SurfaceView, se dibuja una Superficie que se encuentra debajo de una Ventana. Estaba configurando el color de fondo de la Vista en xml; resulta que establece el color de fondo de la ventana, no la superficie. En efecto, hice opaca la ventana para que no pudieras ver la superficie debajo.

Lección aprendida.

+0

¡Guau, gracias por seguir! Tuve el mismo problema y no sé cuánto tiempo hubiera tardado en encontrarlo. Pasé unas horas antes de encontrar la solución aquí. Ugh. – spartygw

+0

He estado buscando durante horas una respuesta por qué el 'unlockCanvasAndPost()' no refrescaría la pantalla aunque se ejecutaron todos los métodos de dibujo ... Finalmente encontré su respuesta y me di cuenta de que era mi problema igual, estaba configurando un fondo negro para la vista y la vista de la superficie estaba dibujando debajo de ella ... casi enloquezco ya: P – JorgeGRC

0

Esto es viejo, pero tengo la sensación de que no hay una devolución de llamada del titular de la superficie. Estaba tratando de dibujar en la superficie antes de que se creara la superficie

Cuestiones relacionadas