2011-03-06 176 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循环的唯一方式。

相关问题