2012-07-27 116 views
1

我寫了一個簡單的遊戲,結構如下。主要的xml佈局有用戶查看:簡單的遊戲bug

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/menuRL" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <com.sokolovlev.UFOtest03.MenuView 
      android:id="@+id/menuView" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 

</RelativeLayout> 

這個視圖有兩個文件。首先是用戶MenuView:

package com.sokolovlev.UFOtest03; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class MenuView extends SurfaceView implements SurfaceHolder.Callback 
{ 
    private SurfaceHolder mSurfaceHolder; //Draw surface 

    public static MenuManager mMenuManager; //Draw manager 

    public MenuView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 

     // Surface events registration 
     mSurfaceHolder = getHolder(); 
     mSurfaceHolder.addCallback(this); 

     mMenuManager = new MenuManager(mSurfaceHolder, context); 
    } 

    @Override 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    { 
     mMenuManager.initPositions(height, width); 
    } 

    @SuppressWarnings("static-access") 
    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
    mMenuManager.setRunning(true); 
     try 
     { 
      mMenuManager.start(); 
     } 
     catch (Exception e) { } 
    } 

    @SuppressWarnings("static-access") 
    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     boolean retry = true; 
     mMenuManager.setRunning(false); 
     while (retry) 
     { 
      try 
      { 
       mMenuManager.join(); 
     retry = false; 
      } 
      catch (InterruptedException e) { } 
     } 
    } 
} 

而第二個文件是這場平局經理:

package com.sokolovlev.UFOtest03; 

import ... 

public class MenuManager extends Thread 
{ 
    private SurfaceHolder mSurfaceHolder; 
    private static boolean mRunning; 

    private int _screenHeight; 
    private int _screenWidth; 

    private ... 

    Context c; 

    private ... 

    public MenuManager(SurfaceHolder surfaceHolder, Context context) 
    { 
     mSurfaceHolder = surfaceHolder; 
     mRunning = false; 
     c = context; 

     ... 
    } 

    public static void setRunning(boolean running) 
    { 
     mRunning = running; 
    } 
    @Override 
    public void run() 
    { 

     while (mRunning) 
     { 
      Canvas canvas = null; 
      try 
      { 
       // подготовка Canvas-а 
       canvas = mSurfaceHolder.lockCanvas(); 
       canvas.drawRGB(0, 0, 0); 

       synchronized (mSurfaceHolder) 
       { 
        //All drawing 
       } 
      } 
      catch (Exception e) { } 
      finally 
      { 
       if (canvas != null) 
       { 
        mSurfaceHolder.unlockCanvasAndPost(canvas); 
       } 
      } 
     } 
    } 
} 

一切正常! (步驟№1)但是如果我按中央按鈕,或者我有來電,或者我打電話給任務管理器(步驟№2)並回到我的應用程序 - 我沒有我的繪圖,只有黑屏(步驟№3) 。但是如果我在步驟2旁邊,然後在我的應用程序中,我發現一切正常。 enter image description here

我不明白,哪裏有重裝對我的圖紙有影響?請幫助!

+1

也許你可以嘗試什麼建議在接受的答案http://stackoverflow.com/questions/3527621/how-to-pause-and-resume-a-surfaceview-thread – Michael 2012-07-27 17:39:54

+0

哦,我只能像LunarLander那樣保存我的表面狀態。 TNX! – Leo 2012-07-28 08:03:06

回答

0

要解決此問題,我需要保存設置並重新啓動我的曲面。然後加載設置。 (見LunarLander示例)