2010-12-13 11 views
5

Bir uygulama başlatıldığında ekranın ortasına yerleştirilmiş bir simgeyle SurfaceView açmak istiyorum. 'Tuval' nesnesinin ne zaman hazır olduğunu izlemek için SurfaceHolder.Callback numaralı uygulamayı kullanarak simge oluşturma işlemini başlatıyorum. Sorum şu: Daha iyi bir yol var mı? SurfaceView'u Drawables ile başlatırken, geri çağırma nesnesi içinde çizim mantığına başvurmak zorunda kalmadan, daha az hantal yöntem var mı?DrawView ile SurfaceView'ın başlatılması

Başvuru için kodum İşte. İlk çizim gelmez nesne:

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

ve sonra benim özel geri arama nesnesi:

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

SurfaceView kullanarak çok fazla sorun yaşıyorum. SurfaceView gibi aktiviteyi bitiremiyorum. Ben 13 SufraceView ... ooohh dertte açık olduğumda OutOfMemoryException alıyorum. Onları nasıl bitireceğini biliyor musun? Sınıfımı SurfaceView ile genişletiyorum. –

cevap

0

Ben sadece Düzen XML dosyasında bir görünüme istedik görüntüyü atayarak böyle bir şey yaptılar. Tuvaline kadar beklemeniz gerekiyorsa ve her şey zaten hazırsa, neden sadece varsayılan bir özellik kullanmıyorsunuz? Açılış ekranım, düzenine eklenen

android:background="@drawable/splash" 

görünümündeydi.