Java 如何在 SurfaceView 之间移动
Java How to move between SurfaceViews
我现在正在开发一款游戏,但我遇到了如何在主菜单和游戏本身之间移动的问题。所以当游戏开始时,它会设置MainMenuPanel
作为第一个View。然后,我将使用 canvas.draw
到 MainMenu 中的一个按钮,当它被按下时它将转到 GamePanel
。
有什么方法可以让我在 MainMenuPanel
class 中再次使用 setContentView?
或者还有其他方法吗?
谢谢!
P.S。我也想过使用 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);
}
}
主菜单面板:
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 没有多大意义,除非您将它们放在不同的 Activity 中。 (参见例如 Android Breakout,它在一个 Activity 中使用 View UI 作为主菜单,但在第二个 Activity 中使用 GLSurfaceView 用于游戏本身。)
由于您在单个 Activity 中将 SurfaceView 用于菜单和游戏,因此没有理由拥有两个单独的 SurfaceView 子类。没有理由将 SurfaceView 子类化,真的,尽管出于某种原因许多示例继续这样做。
创建单个 SurfaceView,并在其上绘制 MainMenuPanel 和 GamePanel。
我现在正在开发一款游戏,但我遇到了如何在主菜单和游戏本身之间移动的问题。所以当游戏开始时,它会设置MainMenuPanel
作为第一个View。然后,我将使用 canvas.draw
到 MainMenu 中的一个按钮,当它被按下时它将转到 GamePanel
。
有什么方法可以让我在 MainMenuPanel
class 中再次使用 setContentView?
或者还有其他方法吗?
谢谢!
P.S。我也想过使用 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);
}
}
主菜单面板:
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 没有多大意义,除非您将它们放在不同的 Activity 中。 (参见例如 Android Breakout,它在一个 Activity 中使用 View UI 作为主菜单,但在第二个 Activity 中使用 GLSurfaceView 用于游戏本身。)
由于您在单个 Activity 中将 SurfaceView 用于菜单和游戏,因此没有理由拥有两个单独的 SurfaceView 子类。没有理由将 SurfaceView 子类化,真的,尽管出于某种原因许多示例继续这样做。
创建单个 SurfaceView,并在其上绘制 MainMenuPanel 和 GamePanel。