2012-11-24 11 views
2

我有一个活动地图显示在全屏模式下的地图:我怎样才能把现有的全屏面板到SurfaceView元正常活动

public class MapActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(new Panel(this)); 
} 

public class Panel extends SurfaceView implements SurfaceHolder.Callback { 

public Panel(Context context) { 
     super(context); 
     getHolder().addCallback(this); 

     // initiate new thread for drawing 
     _thread = new CanvasThread(getHolder(), this); 
} 

// start thread 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
     CanvasThread.setRunning(true); 
     _thread.start(); 
} 

// start drawing objects on canvas 
@Override 
public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
    /* several canvas operations ... 
    */ 
} 

// Thread specific class 
static class CanvasThread extends Thread { 
    private SurfaceHolder _surfaceHolder; 
    private Panel _panel; 
    private static boolean _run = false; 

    public CanvasThread(SurfaceHolder surfaceHolder, Panel panel) { 
     _surfaceHolder = surfaceHolder; 
     _panel = panel; 
    } 

    public static void setRunning(boolean run) { 
     _run = run; 
    } 

    @Override 
    public void run() { 
     Canvas c; 
     Log.d("Thread", "start"); 
     while (_run) { 
      c = null; 
      try { 
       c = _surfaceHolder.lockCanvas(null); 
       synchronized (_surfaceHolder) { 
        Log.d("Thread", "Canvas c init"); 
        _panel.onDraw(c); 
       } 
      } finally { 
       // do this in a finally so that if an exception is thrown 
       // during the above, we don't leave the Surface in an 
       // inconsistent state 
       if (c != null) { 
        _surfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 
} 
} 

现在,我想使用相同的类在SurfaceView元素中的其他活动中显示我的地图。因此,我尝试将SurfaceView元素放入新Activity中,如下所示:

.... 
Panel surface = new KarteActivity().new Panel(this); 
    surface._thread.start(); 
    CanvasThread.setRunning(true); 
    LinearLayout midLL = new LinearLayout(this); 

    midLL.findViewById(R.id.surfaceView1); 
    midLL.addView(surface); 

由于画布为空,所以会导致空指针异常。在全屏模式下,我没有任何错误。 我的错误是什么?

解决此类问题的常用方法如何?

回答

1

好了,终于我有我自己的答案:)这里是解决方案:

  1. 活动包含了SurfaceView元件必须交出SurfaceHolder

    SurfaceView surface = (SurfaceView) findViewById(R.id.surfaceView1); 
    SurfaceHolder surfaceHolder = surface.getHolder(); 
    Panel panel = new Panel(this,surfaceHolder); 
    
  2. 的表面类必须在其构造函数中初始化表面,并且线程将在创建表面时开始。

    public class Panel extends SurfaceView implements SurfaceHolder.Callback { 
    
    public Panel(Context context, SurfaceHolder surfaceHolder) { 
        super(context); 
        surfaceHolder.addCallback(this); 
    } 
    
    // start thread 
    @Override 
    public void surfaceCreated(SurfaceHolder surfaceHolder) { 
        // initiate new thread for drawing 
        _thread = new CanvasThread(surfaceHolder, this); 
        _thread.setRunning(true); 
        _thread.start(); 
    } 
    
    // start drawing objects on canvas 
    @Override 
    public void onDraw(Canvas canvas) { 
        super.onDraw(canvas); 
    /* several canvas operations ... 
    */ 
    } 
    
    // Thread specific class 
    class CanvasThread extends Thread { 
        private SurfaceHolder _surfaceHolder; 
        private Panel _panel; 
        private boolean _run = false; 
    
        public CanvasThread(SurfaceHolder surfaceHolder, Panel panel) { 
         _surfaceHolder = surfaceHolder; 
         _panel = panel; 
        } 
    
        public void setRunning(boolean run) { 
         _run = run; 
        } 
    
        @Override 
        public void run() { 
         Canvas c; 
         Log.d("Thread", "start"); 
         while (_run) { 
          c = null; 
          try { 
           c = _surfaceHolder.lockCanvas(null); 
           synchronized (_surfaceHolder) { 
            Log.d("Thread", "Canvas c init"); 
            _panel.onDraw(c); 
           } 
          } finally { 
           // do this in a finally so that if an exception is thrown 
           // during the above, we don't leave the Surface in an 
           // inconsistent state 
           if (c != null) { 
            _surfaceHolder.unlockCanvasAndPost(c); 
           } 
          } 
         } 
        } 
    } 
    } 
    

这为我工作,但我还是决定单独该类面板出类MapActivity的(在我的问题所示)

相关问题