JAVA-LIBGDX Как правильно настроить scrollPane

Я пытаюсь добавить в свою игру менее скользящее меню (влево и вправо) внизу экрана. Моя проблема в том, что я не могу настроить таблицу внизу экрана, это мой код:

   private void initUI() {
  // inizializzazione dello stage
  stage = new Stage(new ExtendViewport(Gdx.graphics.getWidth(),Gdx.graphics.getHeight()/4));
  Skin skin = new Skin(Gdx.files.internal("ui/uiskin.json"));
  Gdx.input.setInputProcessor(stage);

  // inizializzazione della tabella 
  container = new Table();
  container.setFillParent(true);
  stage.addActor(container);

  Table table = new Table();
  table.debug();

  final ScrollPane scroll = new ScrollPane(table, skin);
  scroll.setFillParent(true);

  InputListener stopTouchDown = new InputListener() {
     public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
        event.stop();
        return false;
     }         
  };

  table.pad(20).defaults().expandY().space(5);

  for (int i = 0; i < 15; i++) {

     table.row();
     TextButton button = new TextButton(i + "dos", skin);
     table.add(button);
     button.addListener(new ClickListener() {
        public void clicked (InputEvent event, float x, float y) {
           System.out.println("click " + x + ", " + y);
        }
     });
  }      

  container.add(scroll).expandY().fill().colspan(1);
  container.row().space(10).padBottom(10);

}

render(){
  Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight()/4); 
  Gdx.input.setInputProcessor(stage);
  stage.draw();
  stage.act(Gdx.graphics.getDeltaTime());
  Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

}

Таким образом, я могу разделить экран на 2 части (верхнюю и нижнюю), но ввод неверен: чтобы активировать первую кнопку, я должен нажать на верхнюю часть экрана, а кнопка «разработана» внизу.

Как создать таблицу с полосой прокрутки внизу экрана?


person user1087543    schedule 31.10.2014    source источник


Ответы (2)


Кажется, есть некоторое непонимание области просмотра, таблицы и того, как их использовать:

Используйте один Viewport для рендеринга всего экрана. Разделите экран с помощью Table. Следовательно, измените первую строку в initUI на

stage = new Stage(new ExtendViewport(Gdx.graphics.getWidth(),Gdx.graphics.getHeight())); (убрать /4)

и настройте метод рендеринга на что-то вроде:

 @Override
 public void render(float delta) {
        Gdx.gl.glClearColor(0, 0, 0, 0);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.
        stage.act(delta);
        stage.draw();
 }

Очистите цветовой буфер, чтобы убедиться, что анимация или операции нажатия кнопок отображаются правильно. Не устанавливайте stage как InputProcessor при каждом вызове кадра. Как только это будет сделано в initUI, все в порядке.

К размеру таблицы: я предполагаю, что таблица не соответствует содержащимся элементам. Следовательно, каждый раз, когда вы добавляете кнопку с помощью table.add(button), добавляйте информацию о ее высоте и ширине с помощью table.add(button).height(...).width(...). Затем таблица и соответствующая панель прокрутки настраиваются правильно.

В настоящее время я вижу только то, что container содержит объект scroll, который заполняет своего родителя, который заполняет весь экран. Поэтому не забудьте добавить в контейнер еще одну таблицу после добавления scroll к container после container.row().space(10).padBottom(10);. Эта таблица будет отображаться под панелью прокрутки.

person Lukas    schedule 02.11.2014

СПАСИБО, я сделал, это мой новый код:

    // inizializzazione dello stage
    stage = new Stage(new ExtendViewport(Constants.VIEWPORT_GUI_WIDTH,Constants.VIEWPORT_GUI_HEIGHT/4));
    Skin skin = new Skin(Gdx.files.internal("ui/uiskin.json"));
    Gdx.input.setInputProcessor(stage);

    // inizializzazione della tabella 
    container = new Table();
    container.setFillParent(true);
    container.bottom();
    stage.addActor(container);

    Table table = new Table();
    table.debug();
    table.bottom();

    final ScrollPane scroll = new ScrollPane(table, skin);
    //scroll.setFillParent(true);
    scroll.setupFadeScrollBars(0f, 0f);

    InputListener stopTouchDown = new InputListener() {
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
            event.stop();
            return false;
        }           
    };

    table.pad(20).defaults().space(5);

    for (int i = 0; i < 15; i++) {
        TextButton button = new TextButton(i + "dos", skin);
        table.add(button).height(scroll.getHeight()).width(Constants.VIEWPORT_GUI_WIDTH/8);
        button.addListener(new ClickListener() {
            public void clicked (InputEvent event, float x, float y) {
                System.out.println("click " + x + ", " + y);
            }
        });
    }       
    container.bottom();
    container.add(scroll).height(Gdx.graphics.getHeight()/3);//.expandY().fill().colspan(1);
    container.row().space(10).padBottom(10);
person user1087543    schedule 03.11.2014