2013-04-09 108 views
16

[更新] 我注意到invalidate()会很好,但它并没有改变什么!所以我把整个选项布局放在表格和滑块+标签的创建中。后退只是添加到表格末尾的文本按钮。我知道它很长的代码,但我似乎需要。
滑块总是有默认宽度

我创建这样的滑块,因为我知道,背景的最小宽度被用于滑块宽度:

public OptionScreen(MainClass game) { 
    super(game); 
    preference = new PreferencesHelper(); 
    font = this.getDefaultFont(25); 
    this.table = new Table(); 
    if (Config.DEBUG) 
     this.table.debug(); 

    // add volumenlabel 
    LabelStyle style = new LabelStyle(font, Color.WHITE); 
    volumenLabel = new Label(Config.VOLUMEN_LABLE, style); 
    table.add(volumenLabel).colspan(2); 
    table.row(); 
    // add slider 
    Skin skin = new Skin(); 
    skin.add("sliderbackground", 
      this.game.manager.get("data/sliderbackground.png")); 
    skin.add("sliderknob", this.game.manager.get("data/sliderknob.png")); 

    SliderStyle sliderStyle = new SliderStyle(); 
    sliderStyle.background = skin.getDrawable("sliderbackground"); 
    sliderStyle.background.setMinWidth(600f); 
    sliderStyle.knob = skin.getDrawable("sliderknob"); 

    volumenSlider = new Slider(0f, 1f, 0.1f, false, sliderStyle); 
    volumenSlider.setValue(preference.getVolumen()); // load current volumen 
    volumenSlider.addListener(new ChangeListener() { 

     @Override 
     public void changed(ChangeEvent event, Actor actor) { 
      volumeValue.setText(String.format("%.01f", 
        volumenSlider.getValue())); 
      // sett the preference 
      preference.setVolumen(volumenSlider.getValue()); 
     } 
    }); 
    // add volslider to stage 
    table.add(volumenSlider); 
    volumenLabel.invalidate(); 

    // table 
    style = new LabelStyle(font, Color.WHITE); 
    // set current volumen 
    volumeValue = new Label(
      String.format("%.01f", volumenSlider.getValue()), style); 
    volumenLabel.setAlignment(2); 
    table.add(volumeValue).width(50f); 
    table.row(); 

    initBackButton(); 

    // init table 
    table.setPosition(Config.VIRTUAL_VIEW_WIDTH/2, 
      Config.VIRTUAL_VIEW_HEIGHT/2 - Config.BLOCK_SIZE * 10); 

    // add a nice fadeIn to the whole table :) 
    table.setColor(0, 0, 0, 0f); 
    table.addAction(Actions.fadeIn(2f)); // alpha fade 
    table.addAction(Actions.moveTo(Config.VIRTUAL_VIEW_WIDTH/2, 
      Config.VIRTUAL_VIEW_HEIGHT/2, 2f)); // move to center of the 
                // screen 
    // add to stage 
    this.stage.addActor(table); 
} 

这是一个表内没有宽度或这样。我已经拍了一下,如果宽度设置,其中如果滑块的其中prefWidth计算时把我的600

Math.max(style.knob == null ? 0 : style.knob.getMinWidth(), style.background.getMinWidth()) 

这是为Sliderclass内滑块的宽度计算。如果我计算并记录它,我得到了600.
在我看来,一切似乎都对,但滑块对于600我来说很小。
背景和knobtext是24x24。
所以我希望你们能告诉我我做错了什么。 silder

回答

13

我找到了解决方案。
它在一个表内,所以宽度由表格宽度attibut来定义。 col和row。
因此,修正方法很简单。

table.add(volumenSlider).width(600).height(60); 

它的600宽度和60高度。



他们刚刚添加了wiki,使其更清晰!

UI小部件不会设置自己的大小和位置。相反,父窗口小部件会设置每个小孩的大小和位置。小部件提供父级可用作提示的最小,首选和最大大小。一些家长小部件(如表格)可能会受到限制,无法确定孩子的大小和位置。要在布局中为小部件指定特定的大小,小部件的最小值,首选大小和最大大小将单独保留,并在父项中设置大小约束。

Layout at Wiki

希望它可以帮助你解决一些问题了。
Regards

0
speedSlider.getStyle().knob.setMinHeight(100)