Android 从frameLayout内的surfaceView调用bringChildToFront()不会';不行?

Android 从frameLayout内的surfaceView调用bringChildToFront()不会';不行?,android,parent-child,surfaceview,android-framelayout,Android,Parent Child,Surfaceview,Android Framelayout,能否将surfaceView子视图添加到frameLayout,然后调用bringChildToFront()将另一个子视图置于surfaceView前面 这是我制作的第一个android应用程序,请告诉我我的设置是否合理,或者我是否在错误的地方做了错误的事情 我有一个活动,它有一个框架布局 我有两个视图(名为pauseMenuView和mainMenuView),它们只是有4个按钮的视图。这些菜单按钮是通过在我的活动中重写onClick()来处理的 我有一个扩展SurfaceView的第三个

能否将surfaceView子视图添加到frameLayout,然后调用bringChildToFront()将另一个子视图置于surfaceView前面

这是我制作的第一个android应用程序,请告诉我我的设置是否合理,或者我是否在错误的地方做了错误的事情

  • 我有一个活动,它有一个框架布局
  • 我有两个视图(名为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时,会创建一个游戏视图并添加到frameLayout中,显示在前面,用户开始玩游戏

    gv = new GameView(this, 1);
    fl.addView(fv, INDEX_GAMEVIEW_VIEW);
    fl.bringChildToFront(gv);
    fl.invalidate();
然后,在游戏中,当用户在我的gameView中单击暂停图标时,onTouchEvent()方法会捕捉到它,我会这样做。(我刚刚公开了我的pauseMenuView,这样我的gameView就可以看到它了)…我的程序似乎直接进入了mThread.pause()行,并且没有对前两行执行任何操作。。。我已经尝试在这里将gameView设置为不可见,当我这样做时,屏幕是完全黑色的,但是如果暂停菜单可见,我可以单击暂停按钮的位置,并且它们确实会被我的活动的onClick()检测到!这是怎么回事

    ((TestGame)getContext()).fl.bringChildToFront(((TestGame)getContext()).pauseMenuView);
    ((TestGame)getContext()).pauseMenuView.bringToFront();
    mThread.pause();

经过两天的搜索,我解决了我的错误。事实证明,关键是将我的gameView的背景色设置为彩色。透明,砰的一声,一切正常。。。我不知道设置是如此关键。希望其他遇到这个问题的人能比我更快地找到这个解决方案,哈哈。你的答案不清楚,如果我需要我的背景颜色是黄色而不是透明的呢?谢谢尼尔,你救了我。我在自定义SurfaceView上叠加了一个ImageButton,也遇到了类似的问题。如果我在视图上设置了.setRotation(float),它将不会在屏幕上显示(即使它应该是由于视图层次结构),但仍会响应触摸事件。很奇怪,在SurfaceView上设置背景色解决了我的问题。