2010-12-13 16 views
5

Vorrei aprire uno SurfaceView con un'icona posta al centro dello schermo quando si avvia un'applicazione per la prima volta. Sto evocando la creazione di icone utilizzando un'implementazione di SurfaceHolder.Callback per tracciare quando l'oggetto 'Canvas' è pronto. La mia domanda è c'è un modo migliore? Esistono metodi meno ingenti di avvio di uno SurfaceView con alcuni Drawables caricati alla creazione senza dover ricorrere alla logica di disegno all'interno di un oggetto di richiamata?Inizializzazione di SurfaceView con un Drawable

Ecco il mio codice per riferimento. In primo luogo l'oggetto che non disegno:

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

e poi il mio oggetto callback privato:

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

Ho molti problemi con SurfaceView. Non riesco a completare l'attività di SurfaceView come finish() mehtod. Sto ottenendo OutOfMemoryException quando apro dire 13 SufraceView ... ooohh sono nei guai. sai come finirli? Sto estendendo la mia classe con SurfaceView. –

risposta

0

ho fatto qualcosa di simile semplicemente assegnando l'immagine che volevo una vista nel file di layout XML. Se devi aspettare fino alla tua tela e tutto è pronto comunque perché non usare solo una proprietà di default? La schermata iniziale di apertura era solo una vista con

android:background="@drawable/splash" 

aggiunto al layout.

Problemi correlati