缩放ImageButton的图像,然后将其居中

时间:2015-03-30 10:16:12

标签: java libgdx scene2d

我想做什么:

    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);

任何想法,也许一些与细胞属性纠缠在一起?除非我手动更改原点并重新包装......似乎没有任何改变。

谢谢!

2 个答案:

答案 0 :(得分:2)

尝试

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

而不是使用宽度宽度和高度* 0.5f并使用它作为原点LibGDX有一个很好的方法用Align.center指定中心。

答案 1 :(得分: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);

我不明白为什么在设置比例后我必须调用pack(),layout()或validate()...但是在尝试了很多组合之后,我发现这个有效。也许有人可以更深入地了解为什么它的工作原理和可能的更好的方式?

理想情况下,我想做的是这样的事情:

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.