libGDX ScrollPane с WidgetGroup вместо Table в качестве виджета ScrollPane?

Из того, что я понимаю, ScrollPane может иметь несколько виджетов, добавленных к нему, используя таблицу в качестве виджета ScrollPane (именно так это делается в тестах ScrollPane в репозитории libGDX).

Я хотел бы добиться чего-то подобного, но хотел бы иметь абсолютное позиционирование многих акторов в виджете ScrollPane, в отличие от табличного позиционирования, которое обеспечивается использованием таблицы в качестве виджета ScrollPane.

Я закончил с этим кодом, который не работает, но в соответствии с Javadoc libGDX он должен, и я не знаю, почему он не работает!

stage = getStage();

// Scroll pane outer container
Container<ScrollPane> container = new Container<ScrollPane>();
container.setSize(Game.getWidth(), Game.getHeight());

// Scroll pane inner container
WidgetGroup widgetGroup = new WidgetGroup();
widgetGroup.setFillParent(true);
widgetGroup.addActor(new Image(MAP_TEXTURE_ATLAS.findRegion("map")));

// Scroll pane
ScrollPane scrollPane = new ScrollPane(widgetGroup);
container.setActor(scrollPane);

stage.addActor(container);

Ничего не отображается на экране вообще;

Однако он работает с приведенным ниже кодом (что, очевидно, не то, что мне нужно, поскольку виджет ScrollPane - это контейнер, в котором может быть только один субъект)

// Scroll pane outer container
Container<ScrollPane> container = new Container<ScrollPane>();
container.setSize(Match3.getWidth(), Match3.getHeight());

// Scroll pane inner container
Container container2 = new Container();
container2.setBackground(new TextureRegionDrawable(MAP_TEXTURE_ATLAS.findRegion("map")));

// Scroll pane
ScrollPane scrollPane = new ScrollPane(container2);
container.setActor(scrollPane);

stage.addActor(container);

Есть ли способ использовать WidgetGroup с ScrollPane, или каким-либо образом, как я могу добиться функциональности, которая мне требуется.

Спасибо

АЛЬТЕРНАТИВНОЕ ОСУЩЕСТВЛЕНИЕ ПРИНЯТОГО ОТВЕТА

Прочитав принятый ответ, я решил создать свой собственный класс, реализация которого приведена ниже;

// Scroll pane outer container
Container<ScrollPane> container = new Container<ScrollPane>();
container.setSize(Match3.getWidth(), Match3.getHeight());

class ScrollWidget extends WidgetGroup {

  private float prefHeight;
  private float prefWidth;

  public ScrollWidget(Image image) {

    prefHeight = image.getHeight();
    prefWidth = image.getWidth();

    addActor(image);
  }

  @Override
  public float getPrefHeight() {

    return prefHeight;
  }

  @Override
  public float getPrefWidth() {

    return prefWidth;
  }
}

ScrollWidget scrollWidget = new ScrollWidget(
    new Image(MAP_TEXTURE_ATLAS.findRegion("map"))
);

// Scroll pane
ScrollPane scrollPane = new ScrollPane(scrollWidget);
scrollPane.setOverscroll(false, false);

scrollPane.layout();
scrollPane.updateVisualScroll();
scrollPane.setScrollY(scrollPane.getMaxY());

container.setActor(scrollPane);

stage.addActor(container);

1 ответ

Решение

При работе с WidgetGroup вы должны сами устанавливать размеры. Актер Image не имеет представления о предпочтительной ширине / высоте и будет по умолчанию равен 0.

непроверенный код, но я сам использую нечто подобное:

Stage stage = new Stage();
WidgetGroup group = new WidgetGroup();
Scrollpane scrollPane = new ScrollPane(group);
scrollpane.setBounds(0,0,screenWidth,screenHeight);
group.setBounds(0,0,totalWidth,totalHeight);
Image image = new Image(texture);
image.setBounds(0,0,imageWidth,imageHeight);
group.addActor(image);
stage.addActor(scrollPane);
Другие вопросы по тегам