Libgdx滑块 - drawables绘制的大小错误

时间:2016-12-16 19:33:59

标签: java libgdx

我正在使用以下代码使用Libgdx绘制滑块:

    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 wrong size 由于某种原因,宽度似乎受到SUNSlider.setBounds(300,300,100,10)的限制;但高度没有。

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

我希望它看起来像在上面,但是被限制在绿色矩形中。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您使用newDrawable调用创建的TextureRegionDrawable默认情况下具有与其原始像素尺寸相匹配的最小尺寸。 Drawable的最小大小可以防止Slider小部件将其绘制为将其适合自己的边界。所以你可以减少最小尺寸:

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

我不确定您的长期计划是什么,但通常您希望所有皮肤的图像都是单个Texture对象的一部分,因此SpriteBatch不需要冲洗自己很多时间画出你的整个场景。

如果由于某种原因你没有这样做,你至少可以使所有这些纯色的drawable使用相同的纹理。它可以简单地是由一切共享的单像素白色纹理。另外,确保你处理用于创建纹理的像素图,或者你正在泄漏内存!

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;

由于您将Texture对象传递给Skin,因此Skin会在处理Skin时将其处理掉。不要忘记用dipose()方法处理皮肤。