3

如何将 ScrollPane 滚动条位置固定在特定位置,以便它显示例如它的子表的最后一项而不是第一项表(默认)?我尝试 setScrollX 和 setScrollY 但它不起作用。

我有一个游戏关卡菜单(有很多关卡),我想在打开该菜单时向用户显示最后解锁的关卡。

4

6 回答 6

5

layout()在尝试调用之前,您可能必须自己手动调用ScrollPanesetScrollXsetScrollY

于 2016-02-25T16:56:30.557 回答
3

当您想避免 ScrollPane 的弹跳效果时,请在您的 show() 方法中使用以下代码,以便 ScrollPane 立即显示您指定的确切位置。

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

除了设置滚动百分比,您还可以使用

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

或者

scrollPane.setScrollY(y);
于 2016-09-13T10:23:14.627 回答
2

如果你有一个垂直堆叠的窗格,这对我有用:

setScrollPercentY(100);
于 2013-05-22T09:34:10.773 回答
2

对我来说,之前的所有答案都不起作用:即使在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
  }
}

一个副作用是在每次布局更改、调整大小等之后再次向下滚动,但这对我来说很好,因为布局无论如何都是非常短暂的。

于 2020-10-29T21:50:12.337 回答
2

这对我有用:

scrollPane.layout();
scrollPane.setScrollPercentY(100);
于 2016-05-03T06:13:37.090 回答
1

此代码用于设置 ScrollPane 的位置、宽度和高度。

scroll.setBounds(0, 60, Gdx.graphics.getWidth(), 200);
于 2014-11-11T07:38:50.990 回答