java - Libgdx slider - 可绘制对象的尺寸绘制错误

标签 java libgdx

我使用以下代码使用 Libgdx 绘制 slider :

    Pixmap pix = new Pixmap(200, 50, Pixmap.Format.RGBA8888);
    pix.setColor(Color.BLACK);
    pix.fill();
    skin.add("sliderBackS", new Texture(pix));

    Pixmap pix1 = new Pixmap(10, 70, Pixmap.Format.RGBA8888);
    pix1.setColor(Color.RED);
    pix1.fill();
    skin.add("knobS", new Texture(pix1));

    Slider.SliderStyle sliderStyle = new Slider.SliderStyle();
    sliderStyle.disabledBackground = skin.newDrawable("sliderBackS");
    sliderStyle.disabledKnob = skin.newDrawable("knobS");
    sliderStyle.background = skin.newDrawable("sliderBackS");
    sliderStyle.knob = skin.newDrawable("knobS");

    skin.add("sunSlider", sliderStyle);
    sunlightSlider = new Slider(0, 100, 1, false, sliderStyle);
    stage.addActor(sunlightSlider);

    sunlightSlider.setBounds(300, 300, 100, 10);

    sunlightSlider.setDisabled(true);
    sunlightSlider.setDebug(true);

然后是其他地方:

    stage.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f));
    stage.draw();

但由于某种原因, slider 中的像素图似乎是按其实际大小绘制的。这可以在下图中看到(绿线应该是,来自调试):

slider wrong size 由于某种原因,宽度似乎受到sunlightSlider.setBounds(300, 300, 100, 10);的限制。但高度却没有。

我知道我可以根据需要选择像素图大小,但我想使用文件中的图像。如果我使用大图像,那么它也会类似地溢出边界。

我希望它看起来像上面一样,但仅限于绿色矩形。

我做错了什么?

最佳答案

TextureRegionDrawable 是您通过 newDrawable 调用创建的,默认情况下其最小尺寸与其原始像素尺寸相匹配。 Drawable 的最小尺寸会阻止 Slider 小部件将其绘制得小到适合自己的边界。所以你可以减小最小尺寸:

sliderStyle.disabledBackground = skin.newDrawable("sliderBackS");
sliderStyle.disabledBackground.setMinWidth(0);
sliderStyle.disabledBackground.setMinHeight(0);
// and so on for other new drawables.

我不确定您的长期计划是什么,但通常您希望所有皮肤图像都成为单个纹理对象的一部分,这样 SpriteBatch 就不必多次刷新自身来绘制整个场景。

如果由于某种原因你没有这样做,你至少可以让所有这些纯色可绘制对象使用相同的纹理。它可以只是一个由所有物体共享的单像素白色纹理。另外,请确保您正在处理用于创建纹理的像素图,否则会泄漏内存!

Pixmap pix = new Pixmap(1, 1, Pixmap.Format.RGBA8888);
pix.setColor(Color.WHITE);
pix.fill();
Texture tex = new Texture(pix);
pix.dispose();
skin.add(tex, "white");

Drawable blackDrawable = skin.newDrawable("white", Color.BLACK);
Drawable redDrawable = skin.newDrawable("white", Color.RED);

Slider.SliderStyle sliderStyle = new Slider.SliderStyle();
sliderStyle.disabledBackground = blackDrawable;
sliderStyle.disabledKnob = redDrawable;
sliderStyle.background = blackDrawable;
sliderStyle.knob = redDrawable;

由于您将纹理对象传递给了皮肤,因此当皮肤被处置时,皮肤也会处置它。不要忘记在 dipose() 方法中处理 Skin。

关于java - Libgdx slider - 可绘制对象的尺寸绘制错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41191308/

相关文章:

java - 在中型 Web 应用程序中处理数据库连接的正确方法

java - 这种线程长计算的实现是否正确?

java - Actions.moveTo 移动到错误的方向

java - jsp基于boolean true false隐藏列表项

Java Swing 注册到事件类型

java - 在 Java 中访问 applicationStorageDirectory

java - 在 libgdx 游戏中设置延迟

ios - 无法在 IntelliJ Idea 上安装 RoboVM 插件

java - 序列化具有双向引用的对象时如何避免堆栈溢出?

java - 使用 libgdx 绘制曲线