LibGdx Как исправить положение полосы прокрутки ScrollPane в определенной позиции?

Как исправить положение полосы прокрутки ScrollPane в определенной позиции, чтобы она отображала, например, последний элемент своей дочерней таблицы вместо первого элемента таблицы (по умолчанию)? Я пробую setScrollX и setScrollY, но это не работает.

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


person Mak    schedule 20.05.2013    source источник


Ответы (6)


Возможно, вам придется вручную вызвать layout() в ScrollPane, прежде чем пытаться вызвать setScrollX или setScrollY.

person codeulike    schedule 25.02.2016

Если вы хотите избежать эффекта переноса ScrollPanes, используйте следующий код в методе show(), чтобы ScrollPane немедленно отображал точную позицию, которую вы указали.

scrollPane.layout(); 
scrollPane.setScrollPercentY(.5f);
scrollPane.updateVisualScroll();

Вместо установки scrollPercent вы также можете использовать

scrollPane.scrollTo(x, y, width, height);

or

scrollPane.setScrollY(y);
person mtosch    schedule 13.09.2016

Это работает для меня, если у вас есть вертикально расположенная панель:

setScrollPercentY(100);
person freddy.smith    schedule 22.05.2013

Это сработало для меня:

scrollPane.layout();
scrollPane.setScrollPercentY(100);
person Julien    schedule 03.05.2016

этот код устанавливает позицию, ширину и высоту ScrollPane.

scroll.setBounds(0, 60, Gdx.graphics.getWidth(), 200);
person Abhinav singh    schedule 11.11.2014

Для меня все предыдущие ответы не сработали: даже после многократного вызова scrollPane.layout() панель прокрутки все еще имела areaHeight (scrollHeight) из -2, 0 или что-то еще. Только позже, во время последующих вызовов компоновки, будет установлена ​​правильная высота, что вызовет анимацию, при которой содержимое будет скользить сверху.

Единственный вариант, который исправил это для моего варианта использования (сначала прокручивая вниз после добавления всего начального контента), заключался в том, чтобы переопределить ScrollPane.layout() и прокручивать вниз после каждого изменения макета:

open class BottomScrollingScrollPane(actor: Actor?, skin: Skin, style: String): ScrollPane(actor, skin, style) {

    override fun layout() {
        super.layout()
        scrollTo(0f, 0f, 0f, 0f)
        updateVisualScroll()
    }
}

... и необязательно, если вы используете libktx:

@Scene2dDsl
@OptIn(ExperimentalContracts::class)
inline fun <S> KWidget<S>.bottomScrollingScrollPane(
    style: String = defaultStyle,
    skin: Skin = Scene2DSkin.defaultSkin,
    init: KBottomScrollingScrollPane.(S) -> Unit = {}
): KBottomScrollingScrollPane {
  contract { callsInPlace(init, InvocationKind.EXACTLY_ONCE) }
  return actor(KBottomScrollingScrollPane(skin, style), init)
}

class KBottomScrollingScrollPane(skin: Skin, style: String) : BottomScrollingScrollPane(null, skin, style), KGroup {
  override fun addActor(actor: Actor?) {
    this.actor == null || throw IllegalStateException("ScrollPane may store only a single child.")
    this.actor = actor
  }
}

Одним из побочных эффектов является повторная прокрутка вниз после каждого изменения макета, изменения размера и т. Д., Но меня это устраивает, поскольку макет в любом случае очень недолговечен.

person tommi    schedule 29.10.2020