2016-12-16 2 views
0

Я рисую слайдер с 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 По какой-то причине ширина, кажется, ограничивается sunlightSlider.setBounds (300, 300, 100, 10); но высота этого не делает.

Я знаю, что я мог бы выбрать размер pixmap для того, что мне нужно, но я хочу использовать изображение из файла. Если я использую большое изображение, то он переполняет границы аналогичным образом.

Я хочу, чтобы он выглядел так, как будто он выше, но ограничен зеленым прямоугольником.

Что я делаю неправильно?

ответ

1

A TextureRegionDrawable, который вы создали с помощью вызовов newDrawable, по умолчанию имеет минимальный размер, соответствующий его первоначальным размерам пикселей. Минимальный размер Drawable препятствует тому, чтобы виджет слайдера рисовал его так же мало, как хотелось бы, чтобы он соответствовал его собственным границам. Таким образом, вы можете уменьшить минимальный размер:

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

я не уверен, что ваши долгосрочные планы, но, как правило, вы хотите, чтобы все изображения вашей кожи, чтобы быть частью одного объекта Texture так 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; 

Так как вы сдадите объект текстуры на кожу, кожа будет избавиться от него, когда кожа расположена. Не забудьте утилизировать Skin в методе dipose().

+0

Спасибо! Я думаю, что я просто не понял setMinWidth (0) и т. Д. Также спасибо за другие детали. – Josiki

 Смежные вопросы

  • Нет связанных вопросов^_^