Вызов метода takeChildToFront () из SurfaceView внутри frameLayout не работает? - PullRequest
4 голосов
/ 04 января 2012

Можете ли вы добавить дочерний элемент 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();
...