2015-03-30 1 views
0

Что я хочу сделать:Масштаб изображения для ImageButton, а затем отцентрировать его

final ImageButtonStyle upStyle = new ImageButtonStyle(); 
    upStyle.up = spriteUp; 
    upStyle.down = spriteDown; 
    upStyle.imageUp = spriteIcon; 

    imgButton = new ImageButton(upStyle); 
    imgButton.getImage().setScale(0.5f); 

Однако, это приводит к следующему результату: White box is the button background, circle with a '2' is the image

Это то, что я хочу: The image is centered

В чтобы достичь этого прямо сейчас, я должен позвонить по этому коду:

float scale = 0.5f; 
imgButton.pack(); 
imgButton.getImage().setOrigin(imgButton.getImage().getWidth() * scale, imgButton.getImage().getHeight() * scale); 

Вещи я пытался играть с, чтобы без результата (в произвольном порядке):

imgButton.getImage().setAlign(Align.center); 
imgButton.invalidate(); 
imgButton.pack(); 
imgButton.getImageCell().align(Align.center); 

Любые идеи, возможно, некоторые свинчивание вокруг со свойствами клеток? Ничто, кажется, ничего не меняет, если я не изменю Origin вручную и не переупакую ...

Спасибо!

ответ

2

Попробуйте

imgButton.getImage().setOrigin(Align.center); 
imgButton.getImage().setScale(0.5f); 

Вместо того, чтобы делать ширину ширину и высоту трюк * 0.5f и использования, что, как происхождение LibGDX имеет хороший способ определения центра с Align.center.

0

Вот что получилось, в конце концов:

final ImageButtonStyle upStyle = new ImageButtonStyle(); 
    upStyle.up = spriteUp; 
    upStyle.down = spriteDown; 
    upStyle.imageUp = spriteIcon; 
    imgButton = new ImageButton(upStyle); 

    final float scale = 0.5f; 
    imgButton.getImage().setScale(scale); 

    // Calling any of these works. 
    imgButton.pack(); 
    imgButton.layout(); 
    imgButton.validate(); 

    // Calling these doesn't work. 
    imgButton.invalidate(); 
    imgButton.invalidateHierarchy(); 

    // Has to be called after either pack(), layout(), or validate() are called. 
    imgButton.getImage().setOrigin(Align.center); 

    stage = new Stage(new StretchViewport(500, 700)); 
    stage.addActor(imgButton); 

Я не понимаю, почему я должен вызвать либо пакет(), макет() или подтверждения() после установки масштаба ... Но после попытки многих комбинаций я нашел, что это работает. Может быть, кто-то может дать более глубокое представление о том, почему это работает так, и может быть, если есть лучший способ?

В идеале я хотел бы сделать что-то вроде этого:

final float scale = 0.5f; 
imgButton.getImage().setScale(scale); 
imgButton.getImage().setOrigin(Align.center); 

// or 
final float scale = 0.5f; 
imgButton.getImage().setScale(scale); 
imgButton.getImage().setOrigin(Align.center); 
imgButton.pack(); // Forcing a pack/invalidate I can live with. 
+0

Кроме того, учитывая, что изображение добавляется в таблицу Баттона, не должны позиционирование/размещение изображения управляется свойствами клеток ? Я пробовал делать это с помощью ячеек, но никуда не денусь. Я ожидал бы этого: «imgButton.getImageCell(). Align (Align.center);» вести себя таким образом. – Artash