Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何在SurfaceView之间移动_Java_Android_Surfaceview - Fatal编程技术网

Java如何在SurfaceView之间移动

Java如何在SurfaceView之间移动,java,android,surfaceview,Java,Android,Surfaceview,我现在正在开发一个游戏,我在如何在主菜单和游戏本身之间移动方面遇到了问题。因此,当游戏开始时,它会将MainMenuPanel设置为第一个视图。然后,我将使用canvas.draw到主菜单中的一个按钮,当它被按下时,它将进入GamePanel 有没有办法在MainMenuPanelclass中再次使用setContentView? 还是有其他方法可以做到这一点? 谢谢 另外,我也想过使用ViewGroup,但在阅读了文档之后,我仍然不知道如何使用它 主要活动: public class Main

我现在正在开发一个游戏,我在如何在主菜单和游戏本身之间移动方面遇到了问题。因此,当游戏开始时,它会将
MainMenuPanel
设置为第一个视图。然后,我将使用
canvas.draw
到主菜单中的一个按钮,当它被按下时,它将进入
GamePanel

有没有办法在
MainMenuPanel
class中再次使用setContentView? 还是有其他方法可以做到这一点? 谢谢

另外,我也想过使用
ViewGroup
,但在阅读了文档之后,我仍然不知道如何使用它

主要活动:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GamePanel gp = new GamePanel(this);
    MainPanel mp = new MainPanel(this);
    //ViewGroup vg = (ViewGroup)(gp.getParent());

    //Remove title
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    //Set fullscreen
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(mp);

    }
}
MainMenuPanel:

public class MainMenuPanel extends SurfaceView implements SurfaceHolder.Callback{
public MainMenuPanel(Context context){
    super(context);

    //Add callback to the surfaceview to intercept events
    getHolder().addCallback(this);

    setFocusable(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,int width, int height){}

@Override
public void surfaceDestroyed(SurfaceHolder holder){
}

@Override
public void surfaceCreated(SurfaceHolder holder){
}
@Override
public boolean onTouchEvent(MotionEvent event){
    if(event.getAction() == MotionEvent.ACTION_DOWN ){
        //Code to move to GamePanel
        }
        return true;
    }
    if(event.getAction() == MotionEvent.ACTION_UP){
        return true;
    }
    return super.onTouchEvent(event);
}
}
}
游戏面板:

public class GamePanel extends SurfaceView implements SurfaceHolder.Callback{
private MainThread thread;
public GamePanel(Context context){
    super(context);

    //Add callback to the surfaceview to intercept events
    getHolder().addCallback(this);

    //Make GamePanel focusable so it can handle events
    setFocusable(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,int width, int height){}

@Override
public void surfaceDestroyed(SurfaceHolder holder){
}

@Override
public void surfaceCreated(SurfaceHolder holder){
}

}
}

除非在单独的活动中使用两个SurfaceView,否则使用它们没有多大意义。(例如,请参见在主菜单的一个活动中使用View UI,而在游戏本身的第二个活动中使用GLSurfaceView。)

由于在单个活动中使用SurfaceView进行菜单和游戏,因此没有理由使用两个单独的SurfaceView子类。实际上,根本没有理由将SurfaceView子类化,尽管出于某种原因,许多示例仍在这样做


创建一个SurfaceView,并在其上绘制MainMenuPanel和GamePanel。

哇,我从来不知道可以有两个活动类。谢谢你的解释。有一件事困扰着我,例如,我已经安装了类,并为主菜单对象(如play_btn、option_btn、hi score等)绘制了它,当我进入游戏本身时,我将停止绘制这些主菜单对象,并开始绘制游戏对象,对吗?但是,主菜单中的这些对象即使没有绘制,也会占用内存吗?有什么办法可以清除它吗?谢谢假设位图中有数据,可以使用
Bitmap.recycle()
丢弃像素数据。或者干脆删除对它的所有引用,等待垃圾收集器完成它的工作。哦,我明白了。还有一件事,关于你刚才说的“删除所有对它的引用”,这是什么意思?你能解释一下吗?ThanksDon在任何字段或局部变量中都没有对对象的引用。