2010-12-13 12 views
5

Me gustaría abrir un SurfaceView con un icono colocado en el centro de la pantalla cuando se inicia una aplicación por primera vez. Estoy evocando la creación de iconos usando una implementación de SurfaceHolder.Callback para rastrear cuando el objeto 'Lienzo' está listo. Mi pregunta es, ¿hay una mejor manera? ¿Existen métodos menos engorrosos para iniciar un SurfaceView con algunos Drawables cargados en la creación sin tener que recurrir a la colocación de la lógica de extracción dentro de un objeto de devolución de llamada?Inicializando SurfaceView con un Drawable

Aquí está mi código de referencia. En primer lugar el objeto que no dibujo:

public class CanvasDraw{ 
    protected final SurfaceHolder mHolder; 
    protected final Drawable mDrawable; 

    public interface DrawLogic{ 
     void draw(Rect _surface); 
    } 

    public CanvasDraw(SurfaceView _view, Drawable _drawable){ 
     mHolder = _view.getHolder(); 
     mDrawable = _drawable; 
    } 

    public void draw(DrawLogic _logic){ 
     Canvas canvas = null; 
     try{ 
      canvas = mHolder.lockCanvas(); 
      if(canvas != null){ 
       Log.i("DRAWABLE", "Drawing " + mDrawable.toString()); 
       _logic.draw(mHolder.getSurfaceFrame()); 
       mDrawable.draw(canvas); 
      } 
      else{ 
       Log.i("DRAWABLE", "Canvas null valued"); 
      } 
     } 
     finally{ 
      if(canvas != null){ 
       mHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

y luego mi objeto de devolución de llamada privada:

private class DrawOnceCallback implements SurfaceHolder.Callback { 
    private final SurfaceHolder mHolder; 

    public DrawOnceCallback(SurfaceHolder _holder){ 
     mHolder = _holder; 
     mHolder.addCallback(this); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     Log.i("SURFACEHOLDER","Surface created. Canvas available."); 
     mDrawTiles.draw(new CanvasDraw.DrawLogic(){ 

      @Override 
      public void draw(Rect _surface) { 
       mTiles.setBounds( 
        _surface.centerX() - mDrawWidth/2, 
        _surface.centerY() - mDrawHeight/2, 
        _surface.centerX() + mDrawHeight/2, 
        _surface.centerY() + mDrawHeight/2); 
      } 

     }); 
     mHolder.removeCallback(this); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) {Log.i("SURFACEHOLDER","Surface destroyed.");} 
} 
+0

Estoy teniendo muchos problemas con SurfaceView. No puedo terminar la actividad de SurfaceView como finish() mehtod. Estoy recibiendo OutOfMemoryException cuando abro decir 13 SufraceView ... ooohh Estoy en problemas. ¿sabes cómo terminarlos? Estoy ampliando mi clase con SurfaceView. –

Respuesta

0

hice algo como esto simplemente mediante la asignación de la imagen que quería una vista en el archivo de diseño XML. Si tiene que esperar hasta que su lienzo y todo lo que está listo de todos modos, ¿por qué no usar una propiedad predeterminada? Mi pantalla inicial de bienvenida fue solo una vista con

android:background="@drawable/splash" 

agregado a su diseño.

Cuestiones relacionadas