2014-05-11 47 views
5

Nie wiem, czy to tylko ja, ale drawables mylić. Czy mają one zachować rozmiar, jaki mają, czy też istnieje sposób na skalowanie obrazu w nich? Rozumiem, że mogą używać ninepatcha do wypełniania niektórych obszarów przez rozciąganie obrazu, ale chcę przeskalować obraz, który się rozciąga. Używam przycisków menu, które są TextButton , ale są o wiele za duże i bardzo chciałbym wiedzieć, jak je skalować. Pobieram skórę z atlasu, w którym znajdują się obrazy z ninepatch. Oto ekran ustawień: The settings screen Oto obrazy w opakowanie Używam: ninepatch images packed Oto inicjalizacji TextureAtlas i skóry:skalowanie przycisku scene2d za pomocą libgdx

buttonAtlas = new TextureAtlas(Gdx.files.internal("buttons/buttons.pack")); 
buttonSkin = new Skin(buttonAtlas); 

Oto inicjalizacji tego przycisku menu .

TextButtonStyle textButtonStyle = new TextButtonStyle(); 
textButtonStyle.up = Assets.buttonSkin.getDrawable("bluebutton"); 
textButtonStyle.down = Assets.buttonSkin.getDrawable("redbutton"); 
textButtonStyle.font = font; 

buttonMenu = new TextButton("Menu", textButtonStyle); 
buttonMenu.pad(20.0f); 
buttonMenu.addListener(new ClickListener() { 
    @Override 
    public void clicked(InputEvent event, float x, float y) { 
     game.fade.startFadeOut(); 
     super.clicked(event, x, y); 
    } 
}); 

A może mógłbym zmienić sposób włożenia go do stołu lub ustawienia stołu na stole montażowym?

table.add(buttonMenu).width(Gdx.graphics.getWidth()/4); 
stage.addActor(table); 

W ostateczności sądzę, że mógłbym spróbować stworzyć własnego aktora z przyciskiem tekstowym, który mógłbym skalować, dziękuję za poświęcony czas.

Odpowiedz

1

Po pierwsze, jeśli wiesz, że twoje zdjęcia są zbyt duże: Najlepiej byłoby skalować same obrazy do mniejszego rozmiaru, a następnie użyć TexturePackera, aby wygenerować nowy TextureAtlas zawierający mniejsze obrazy.

Zresztą można skalować przycisk obrazu z TableLayout jeśli naprawdę chcesz, patrz przykład:

table.add(buttonMenu).width(100).height(100); 
0

Powyższa praca odpowiedź zrobił dla mnie, ale mam rozwiązanie.

Możesz zrobić drugi aparat i dołączyć go do swojej sceny. do skalowania stół tylko skalowanie rozmiaru rzutni kamery wtórnego

Przykładem może być:

//Heres where you set the scale of your buttons and your table 
Camera secondaryCamera = new Camera(Gdx.graphics.getWidth() * scale, 
            Gdx.graphics.getHeight() * scale); 


Stage stage = new Stage(); 
Table table = new Table(); 
ImageButton button = new ImageButton(drawableUp, drawableDown, drawableChecked); 
table.setFillParent(true); 

stage.getViewport().setCamera(secondaryCamera); 

table.add(ImageButton); 
stage.addActor(table); 

Działa to doskonale, kiedy używasz go do kontroli dotykowych. Możesz użyć tabeli dla całego interfejsu i skalować ją do swoich potrzeb niezależnie od innych elementów gry;

0

table.add(buttonMenu).width(100).height(100); powinny działać, a po prostu trzeba dostosować parametry width i height do własnych upodobań, można też użyć metody setBounds. Oto przykład:

TextButton myButton = new TextButton("Press Me", style); 
    myButton.setBounds(xCoordinate, yCoordinate, width, height); 
0

Można ustawić wielkość Drawable w ButtonStyle do zmiany rozmiaru Button:

float scale = 0.5f; 
float currentHeight = textButtonStyle.up.getMinHeight(); 
textButtonStyle.up.setMinHeight(currentHeight * scale); 

Aby uzyskać więcej informacji, zobacz official document for layout:

widgety UI nie ustawisz własnej wielkości i pozycji. Zamiast tego widżet nadrzędny określa rozmiar i położenie każdego dziecka. Widżety zapewniają minimalny, preferowany i maksymalny rozmiar, który rodzic może wykorzystać jako wskazówki. Niektórym widżetom nadrzędnym, takim jak Tabela i pojemnik, można nadać ograniczenia dotyczące wymiarowania i pozycjonowania elementów podrzędnych. Aby nadać widgetowi określony rozmiar w układzie, minimalny, preferowany i maksymalny rozmiar widżetu jest pozostawiony sam, a ograniczenia rozmiaru są ustawiane w obiekcie nadrzędnym.

i można znaleźć realizację Button.getPrefHeight() w source code:

public float getPrefHeight() { 
    float height = super.getPrefHeight(); 
    if (style.up != null) height = Math.max(height, style.up.getMinHeight()); 
    if (style.down != null) height = Math.max(height, style.down.getMinHeight()); 
    if (style.checked != null) height = Math.max(height, style.checked.getMinHeight()); 
    return height; 
}