Для меня все предыдущие ответы не сработали: даже после многократного вызова 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