2010-12-13 20 views
5

Je voudrais ouvrir un SurfaceView avec une icône placée au centre de l'écran lorsqu'une application est d'abord commencé. J'évoque la création d'une icône en utilisant une implémentation de SurfaceHolder.Callback pour suivre quand l'objet 'Canvas' est prêt. Ma question est la suivante: y a-t-il un meilleur moyen? Y at-il des méthodes de démarrage d'une SurfaceView avec une Drawables chargée sur la création moins encombrants, sans avoir à recourir à placer la logique de tirage dans un objet de rappel?SurfaceView avec un Initializing Drawable

Voici mon code pour référence. Tout d'abord l'objet qui ne dessin:

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

puis mon objet de rappel privé:

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

J'ai beaucoup de mal à l'aide SurfaceView. Je ne peux pas finir SurfaceView comme activité avoir fini() mehtod. Je reçois OutOfMemoryException quand j'ouvre dire 13 SufraceView ... ooohh Je suis en difficulté. Savez-vous comment les finir? Je prolonge ma classe avec SurfaceView. –

Répondre

0

je l'ai fait quelque chose comme cela simplement en affectant l'image que je voulais une vue dans le fichier XML de mise en page. Si vous devez attendre votre toile et tout ce qui est prêt, pourquoi ne pas utiliser une propriété par défaut? Mon écran de démarrage d'ouverture était juste une vue avec

android:background="@drawable/splash" 

ajouté à sa mise en page.