我使用以下代码使用 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 中的像素图似乎是按其实际大小绘制的。这可以在下图中看到(绿线应该是,来自调试):
由于某种原因,宽度似乎受到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/