能不能给一个frameLayout添加一个surfaceView子视图,然后调用bringChildToFront()把另一个子视图带到surfaceView前面?
这是我制作的第一个 android 应用程序,所以请让我知道我的设置是否有意义,或者我是否在错误的地方做错了事情。
- 我有一个活动,它有一个 FrameLayout。
- 我有 2 个视图(名为 pauseMenuView 和 mainMenuView),它们只是具有 4 个按钮的视图。这些菜单按钮是通过在我的活动中覆盖 onClick() 来处理的。
- 我有一个扩展 SurfaceView 的第三个自定义视图(称为 gameView)。这是我目前正在处理关于我的游戏玩法的几乎所有内容(处理触摸事件、绘制图形、动画、碰撞检测)的地方。我有一个单独的线程来控制游戏的状态(暂停、未暂停等)和帧速率。
所以基本上,在玩游戏时,我在屏幕的左上角有一个暂停图标。我正在努力做到这一点,以便当他们触摸该图标时,我的 gameView 的 onTouchEvent 调用bringChildToFront(pauseMenuView) 来显示暂停菜单。但是,目前当我调用bringChildToFront() 或bringToFront() 时,没有任何反应,好像它们没有效果一样。我的游戏视图仍然可见。
这是我活动中的相关代码:
public static final int INDEX_MAIN_MENU_VIEW = 0;
public static final int INDEX_PAUSE_MENU_VIEW = 1;
public static final int INDEX_GAMEVIEW_VIEW = 2;
fl = new FrameLayout(this);
LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
fl.setLayoutParams(lp);
mainMenuView = View.inflate(this, R.layout.main_menu,null);
pauseMenuView = View.inflate(this, R.layout.pause_menu, null);
fl.addView(mainMenuView, INDEX_MAIN_MENU_VIEW);
fl.addView(pauseMenuView, INDEX_PAUSE_MENU_VIEW);
setContentView(fl);
View onePlayerButton = findViewById(R.id.onePlayer_button);
onePlayerButton.setOnClickListener(this);
/* then i set up a bunch of pauseMenu and mainMenu buttons the same way, so I won't put them here */
fl.bringChildToFront(mainMenuView);
因此,当应用启动时,mainMenuView 被带到最前面,当玩家单击 onePlayerButton 时,会创建一个 gameView 并将其添加到 frameLayout 中,并被带到最前面,然后用户开始玩游戏。
gv = new GameView(this, 1);
fl.addView(fv, INDEX_GAMEVIEW_VIEW);
fl.bringChildToFront(gv);
fl.invalidate();
然后,在游戏中,当用户单击我的游戏视图中的暂停图标时,onTouchEvent() 方法会捕获它并执行此操作。(我刚刚公开了我的 pauseMenuView 以便我的 gameView 可以看到它)...似乎我的程序直接进入 mThread.pause() 行并且对前 2 行没有做任何事情...我试过了在这里将gameView设置为不可见,当我这样做时,屏幕完全是黑色的,但是如果暂停菜单可见,我可以单击暂停按钮所在的位置,并且它们实际上确实被我的活动的onClick()检测到!这里发生了什么?
((TestGame)getContext()).fl.bringChildToFront(((TestGame)getContext()).pauseMenuView);
((TestGame)getContext()).pauseMenuView.bringToFront();
mThread.pause();