2011-03-06 62 views
0

我只是在玩帆布和表面視圖以獲得更好的理解,但是當我打開手機的碰撞和視圖幾乎相同時我雖然表面是支持保重在這裏我的代碼可以告訴我發生了什麼以及如何解決它。android canvas當我的手機崩潰時

public class test extends Activity { 
private int Playery =0; 
private int Playerx =0; 
private float RectStartx =0; 
private float RectStarty= 120; 
private float RectEndx =240; 
private float RectEndy =240; 
private int ImageBottom; 

private boolean trueOrFalse = true; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new Frame(this)); 
    } 

    class Frame extends SurfaceView implements SurfaceHolder.Callback{ 
     private frameThread thread; 

     public Frame(Context context) { 
      super(context); 
      getHolder().addCallback(this); 
      thread = new frameThread(getHolder(),this); 
     } 

     @Override 
     public void onDraw(Canvas canvas){ 
      canvas.drawColor(Color.RED); 
      canvas.drawRect(RectStartx, RectStarty, RectEndx, RectEndy, new Paint(Color.RED)); 

      if(trueOrFalse == true){ 
       Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
       canvas.drawBitmap(bitmap, Playerx, Playery, null); 

       ImageBottom = Playery + bitmap.getHeight(); 

       if(ImageBottom != RectStarty || Playerx > RectEndx || Playerx < RectStartx){ 
        Playery = Playery+2; 
       } 

       if(Playery > RectEndx){ 
        trueOrFalse = false; 
       } 
      } 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      if(ImageBottom == RectStarty){ 
       Playerx = Playerx+10; 
      } 

      return super.onTouchEvent(event); 
     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

     } 
     public void surfaceCreated(SurfaceHolder holder) { 
      thread.setRunning(true); 
      thread.start(); 
     } 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      boolean retry = true; 
      while (retry){ 
       try{ 
        thread.join(); 
        retry = false; 
       }catch(InterruptedException e){ 

       } 
      } 
     } 
    } 

    class frameThread extends Thread{ 
     private SurfaceHolder _surfaceHolder; 
     private Frame _frame; 
     private boolean _run = false; 

     public frameThread(SurfaceHolder surfaceHolder, Frame frame){ 
      _surfaceHolder = surfaceHolder; 
      _frame = frame; 
     } 

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

     @Override 
     public void run(){ 
      Canvas c; 
      while(_run){ 
       c = null; 
       try{ 
        c = _surfaceHolder.lockCanvas(null); 
       synchronized (_surfaceHolder){ 
        _frame.onDraw(c); 
       } 
       }finally{ 
        if(c != null){ 
         _surfaceHolder.unlockCanvasAndPost(c); 
        } 
       } 
      } 
     } 
    } 
} 

回答

1

當您打開手機時,您的視圖將被破壞並重新創建。

在你的surfaceDestroyed(SurfaceHolder)方法你join()在你的框架線程,我猜這個連接永遠不會成功,並導致你的應用程序強制退出。

它看起來像你需要在你的線程setRunning(false)加入之前,因爲這是你的線程將離開其while循環的唯一方式。

相關問題