2013-04-09 111 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)