2010-12-13 5 views
5

Ich möchte eine SurfaceView mit einem Symbol in der Mitte des Bildschirms, wenn eine Anwendung gestartet wird, zu öffnen. Ich erstelle die Icon-Erstellung mit einer Implementierung von SurfaceHolder.Callback, um zu verfolgen, wann das Canvas-Objekt bereit ist. Meine Frage ist, gibt es einen besseren Weg? Gibt es weniger umständliche Methoden zum Starten eines SurfaceView mit einigen Drawables bei der Erstellung geladen, ohne auf Zeichnungslogik in einem Callback-Objekt platzieren zu müssen?Initialisierung von SurfaceView mit einem Drawable

Hier ist mein Code als Referenz. Zunächst wird das Objekt, das tut Zeichnung:

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

und dann meine private Callback-Objekt:

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

Ich habe große Probleme mit SurfaceView. Ich kann SurfaceView nicht beenden wie Aktivität beenden() mehtod. Ich bekomme OutOfMemoryException, wenn ich 13 SufraceView öffne ... ooohh Ich bin in Schwierigkeiten. Weißt du, wie man sie beendet? Ich erweitere meine Klasse mit SurfaceView. –

Antwort

0

Ich habe so etwas wie dies einfach durch die Zuordnung des Bildes I zu einer Ansicht in der Layout-XML-Datei gesucht. Wenn Sie warten müssen, bis Ihre Leinwand und alles bereit ist, warum nicht einfach eine Standardeigenschaft verwenden? Mein Eröffnungsbildschirm wurde nur mit

android:background="@drawable/splash" 

zu seinem Layout hinzugefügt.