我正在使用以下代码使用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();
但由于某些原因,滑块中的像素图似乎是以实际尺寸绘制的。这可以在下面的图片中看到(绿线是它应该是什么,来自调试):
由于某种原因,宽度似乎受到SUNSlider.setBounds(300,300,100,10)的限制;但高度没有。
我知道我可以根据需要选择像素图大小,但我想使用文件中的图像。如果我使用一个大图像,那么它也会溢出边界。
我希望它看起来像在上面,但是被限制在绿色矩形中。
我做错了什么?
答案 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()
方法处理皮肤。