2010-12-13 5 views
5

SurfaceViewは、アプリケーションが最初に起動されたときにアイコンが画面の中央に配置されるようにしたいと考えています。私はSurfaceHolder.Callbackの実装を使用してアイコン作成を呼び起こして、 'キャンバス'オブジェクトの準備が整ったことを追跡します。私の質問は、より良い方法があるということですか? SurfaceViewを起動して、コールバックオブジェクト内に描画ロジックを配置する必要がなく、作成時にDrawablesがロードされる厄介な方法はありませんか?DrawableでSurfaceViewを初期化する

ここに参考のためのコードがあります。まず、描画ん対象:

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

、その後、私のプライベートコールバックオブジェクト:

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を使用して多くの問題を抱えています。私はSurfaceViewのようなアクティビティをfinish()mehtodで終了できません。私がOutOfMemoryExceptionを出すのは、私が13 SufraceView ...と言うときに出てきます。私は困っています。あなたはそれらを仕上げる方法を知っていますか?私はSurfaceViewでクラスを拡張しています。 –

答えて

0

私は単に私がレイアウトXMLファイル内のビューに望んでいた画像を割り当てることによって、このような何かをしました。キャンバスとその準備が整っているまで待たなければならないのであれば、デフォルトのプロパティを使用するだけではないのですか?私のオープニングスプラッシュ画面は、

android:background="@drawable/splash" 

というレイアウトになっています。

関連する問題