Можете ли вы добавить дочерний элемент SurfaceView в frameLayout, а затем вызвать метод takeChildToFront (), чтобы вывести другой дочерний вид перед SurfaceView?
Это мое первое приложение для Android, которое я сделал, поэтому, пожалуйста, дайте мне знать, если мои настройки имеют смысл или я делаю неправильные вещи в неправильных местах.
- У меня есть одно действие с FrameLayout.
- У меня есть 2 представления (называемые pauseMenuView и mainMenuView), которые являются просто представлениями, имеющими 4 кнопки. Эти кнопки меню обрабатываются путем переопределения onClick () внутри моей деятельности.
- У меня есть 3-й пользовательский вид (называемый gameView), который расширяет SurfaceView. Именно здесь я сейчас обрабатываю почти все, что касается моего игрового процесса (обработка сенсорных событий, рисование графики, анимация, обнаружение столкновений). У меня есть отдельная нить для управления состоянием (приостановлено, не приостановлено и т. Д.) И частотой кадров игры.
Таким образом, во время игры у меня есть значок паузы в левом верхнем углу экрана. Я пытаюсь сделать так, чтобы, когда они касались этого значка, onTouchEvent моего gameView вызывал метод takeChildToFront (pauseMenuView) для отображения меню паузы. Тем не менее, в настоящее время, когда я вызываю метода takeChildToFront () или yieldToFront (), ничего не происходит, как будто они не имеют никакого эффекта. Мой gameView все еще виден.
Вот соответствующий код из моей деятельности:
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();