当前位置: 首页 > 知识库问答 >
问题:

如何在代码中滚动ScrollPane?

阎涵忍
2023-03-14

我使用ScrollPane,因为它内置了输入和抛出处理。我有一个滚动轮的图像,分为14个部分,滚动窗格本身是两个部分较短,以便将有一个部分在右侧和左侧,它可以滚动到任何一个方向。一旦滚动位置到达任何一个方向的末端,我想将滚动位置重置回中心。一遍又一遍地这样做应该会产生一个无限滚动轮的幻觉(希望如此)。

我遇到的问题是如何在代码中定位滚动窗格以重置图像,一旦它到达任何一端。到目前为止,我没有尝试设置滚动位置工作。我尝试了setScrollX()和scrollTo()方法。我还尝试将scrollpane的大小设置为不同的大小(与image大小相同,并且比image小两个部分)。在设置滚动值之前,我尝试调用scrollpane上的layout、invalidate和pack,以确保它的布局是正确的。我认为updateVisualScroll()可能会强制它更新滚动位置,但这也没有效果。

不管我做什么,它只是忽略所有改变滚动位置的调用,所以我显然遗漏了一些东西。在下面的代码中,我试图让滚动轮从图像的中心开始,相反,它的开始位置一直在左边。

public class MyScrollWheel extends Container<ScrollPane> {
    private ScrollPane scrollPane;
    private Image image;
    private int scrollOffset;

    public MyScrollWheel(){
        Texture texture = new Texture(Gdx.files.internal("internal/scrollwheel.png"));
        image = new Image(texture);

        scrollOffset = (int)(image.getWidth()/14);

        scrollPane = new ScrollPane(image);
        scrollPane.setOverscroll(false, false);

        setActor(scrollPane);
        size(image.getWidth()-(scrollOffset*2), image.getHeight());

        scrollPane.setScrollX(scrollOffset); // << this doesn't scroll
        scrollPane.updateVisualScroll();
    }
}

共有1个答案

宇文嘉勋
2023-03-14

好吧,我希望能找到一些你可以借鉴的东西。我所做的只是扩展actor并让它接受一个纹理,这样我就可以使用Texture.wrap并用spritebatch.draw()绘制它。我现在可以继续滚动它,基于滚动增量,你可以计算出它已经滚动了多远。我认为没有必要重置轮子,但是如果您真的想重置轮子,可以执行wheel.setscroll(0);

一个限制是它不是drawable,因此不能像ninePatch那样进行缩放。你必须给它一个普通的车轮纹理绘制它的大小,你想让它矛,你可以添加正常的缩放,但保持宽高比手动。然后添加边到它,也许覆盖一个渐变在那些创建深度。

滚动轮:

public class ScrollWheel extends Actor {
    Texture wheelTexture;
    private int scroll = 0;

    public int getScroll() {
        return scroll;
    }
    public void setScroll(int scroll) {
        this.scroll = scroll;
    }

    public ScrollWheel(Texture texture)
    {
        wheelTexture = texture;
        wheelTexture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.ClampToEdge);

        setWidth(texture.getWidth());
        setHeight(texture.getHeight());
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        super.draw(batch, parentAlpha);

        batch.draw(wheelTexture, getX(), getY(), scroll, 0,
                wheelTexture.getWidth(), wheelTexture.getHeight());
    }
}
public class TestScreen implements Screen {
    Stage stage;
    ScrollWheel wheel;

    public TestScreen() {
        stage = new Stage();
        Table t = new Table();
        t.setFillParent(true);
        stage.addActor(t);

        wheel = new ScrollWheel(new Texture("hud/wheel_part.png"));
        wheel.addListener(new DragListener() {
            @Override
            public void drag(InputEvent event, float x, float y, int pointer) {
                super.drag(event, x, y, pointer);
                wheel.setScroll(wheel.getScroll() + (int)getDeltaX());
            }
        });

        t.add(wheel);
        Gdx.input.setInputProcessor(stage);
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(.3f, .36f, .42f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        stage.act();
        stage.draw();
    }
    //...Other mandatory screen methods...
}

scrollhtml" target="_blank">变量实际上保存滚动量,因此如果您希望将滚动量限制在0到100之间,只需在setscroll()中添加此功能即可。

if (scroll > 100) scroll = 100; 
else if (scroll < 0) scroll = 0;

然后可以向其添加一个步骤。因此,如果要使用滑块旋转图像,可以通过滚动*3,6f滚动*(maxScroll/maxStep)设置旋转

我真的很喜欢这个结果,我将来会用这个来做我的滑块:D。我已经对它进行了一些扩展和修改,您可以在这里看到我的实现:https://youtu.be/rnlk5b-vfyg

 类似资料:
  • 我正在咨询你,因为我正在处理一些关于VSCODE的困扰我的事情。 我们目前正在创建一个应用程序,它应该在本地运行,所以我们的代码中确实有很多base64行。可以想象,这些字符串相当大: 这对我(和我的同事)来说是个问题,因为我们对这种轻量级的“Visual Studio”式编辑器很感兴趣,但又无法避免出现断行,这使得导航某些脚本非常复杂。

  • 我在工作(Ubuntu)和家庭(Windows 7)中都使用PhpStorm。我在家里的版本中缺少的一件事是“从源代码滚动”按钮,如下所示: 在我的家庭版本中完全没有。我已经找过了,但是我得到的只是帮助设置“从源滚动”热键的插件的结果,关于它不能正常工作的报告,或者(看起来)不相关的事情,比如这里。 这个按钮是一个插件吗?还是它随基础安装一起来的?我想做的就是直接跳转到我当前打开的文件,截图中的按

  • 问题内容: 目前,这是我的kv代码,无法滚动: 您如何使上面的kv代码可滚动?我知道Kivy ScrollView仅接受一个孩子,并且我已经使GridLayout成为新ScrollView的孩子。但这不起作用。有什么建议吗? 问题答案: 根据ScrollView的文档,您必须至少禁用ScrollView的子size_hint之一: 并绑定布局的大小以适应自身:

  • 我正在使用Appium测试混合android应用程序。我想滚动到页面底部,然后点击一个链接。谁能告诉我如何滚动到页面底部吗。 非常感谢!

  • 我使用的是RichTextFX,我很惊讶代码区没有默认启用滚动条。我怎样才能让它出现?

  • 我尝试在JTable中捕获鼠标滚轮事件。不拖动时,它接收MouseWheelMove事件,但拖动时,它什么也不接收。我的猜测是鼠标滚轮事件被传递给与TransferHandler相关的东西,而不是JTable。 如何在拖动时检测鼠标滚轮运动?只要达到我的目的,任何其他方法都是受欢迎的。