Android 无法在Libgdx中的TextButton上执行缩放动画

Android 无法在Libgdx中的TextButton上执行缩放动画,android,opengl-es,libgdx,tween,Android,Opengl Es,Libgdx,Tween,我想使用Tween引擎在文本按钮上执行缩放动画。 我对精灵和字体及其各自的访问器使用了相同的代码。但仅对于TextButton,代码不起作用。代码如下: private void initLevelUpAnimation() { Log.d("Runnable", "animation method called"); Skin skin = new Skin(); //empty constructor causes it not to load yet. ski

我想使用Tween引擎在文本按钮上执行缩放动画。 我对精灵和字体及其各自的访问器使用了相同的代码。但仅对于TextButton,代码不起作用。代码如下:

private void initLevelUpAnimation() {


    Log.d("Runnable", "animation method called");

    Skin skin = new Skin(); //empty constructor causes it not to load yet.
    skin.add("level_new", levelUpBG);

    levelupButtonStyle = new TextButton.TextButtonStyle();
    levelupButtonStyle.font = game.levelUpFont;
    levelupButtonStyle.up = skin.getDrawable("level_new");
    levelupButtonStyle.down = skin.getDrawable("level_new");
    levelupButtonStyle.over = skin.getDrawable("level_new");
    levelupButtonStyle.disabled = skin.getDrawable("level_new");


    levelupButton = new TextButton("LEVEL " + (baseLevel + 1) + "\n" + "KEEP GOING", levelupButtonStyle);
    levelupButton.setSize(265, 180);
    levelupButton.setPosition(gamePlayBG.getWidth() / 2 - levelupButton.getWidth() / 2,
            gamePlayBG.getHeight() / 2 - levelupButton.getHeight() / 2);

    Log.d("TWEEN", "Read to animate: ");

    Tween.to(levelupButton, ButtonAccessor.SCALE_XY, 0.01f)
            .ease(Elastic.INOUT)
            .target(0.1f, 0.1f)
            .setCallback(new TweenCallback() {
                @Override
                public void onEvent(int type, BaseTween<?> source) {
                    stopGameObjects = true;
                    Log.d("TWEEN", "First completed : 0.3");
                    Tween.to(levelupButton, ButtonAccessor.SCALE_XY, 0.7f)
                            .ease(Elastic.INOUT)
                            .target(1.1f, 1.1f)
                            .setCallback(new TweenCallback() {
                                @Override
                                public void onEvent(int type, BaseTween<?> source) {
                                    Log.d("TWEEN", "Second completed : 0.3");
                                    Tween.to(levelupButton, ButtonAccessor.SCALE_XY, 0.7f)
                                            .ease(Elastic.INOUT)
                                            .target(0.8f, 0.8f)
                                            .setCallback(new TweenCallback() {
                                                @Override
                                                public void onEvent(int type, BaseTween<?> source) {
                                                    Log.d("TWEEN", "Third completed : 0.3");

                                                    Tween.to(levelupButton, ButtonAccessor.SCALE_XY, 1.0f)
                                                            .ease(Elastic.OUT)
                                                            .target(1.3f, 1.3f)
                                                            .setCallback(new TweenCallback() {
                                                                @Override
                                                                public void onEvent(int type, BaseTween<?> source) {

                                                                    Log.d("TWEEN", "Fourth completed : 0.7");


                                                                    Tween.to(levelupButton, ButtonAccessor.ROTATION, 1.0f)
                                                                            .ease(Elastic.OUT)
                                                                            .target(1.0f, 1.0f)
                                                                            .setCallback(new TweenCallback() {
                                                                                @Override
                                                                                public void onEvent(int type, BaseTween<?> source) {
                                                                                    Log.d("TWEEN", "Fifth completed : 1.0");


                                                                                    stopGameObjects = false;

                                                                                    updateScoreTime();
                                                                                }
                                                                            })
                                                                            .start(game.tweenManager);
                                                                }
                                                            })
                                                            .start(game.tweenManager);
                                                }
                                            })
                                            .start(game.tweenManager);
                                }
                            })
                            .start(game.tweenManager);
                }
            })
            .start(game.tweenManager);
 }

按钮在屏幕中绘制,但未设置动画。有人能告诉我这里做错了什么吗?

添加:
按钮.setTransform(true)到您的init方法

更多信息如下:(文本按钮扩展表格)

然而,我建议使用一个舞台,观察场景2D的动作。这与通用tween引擎的作用相同,但更易于用于scene2D演员(如您已经使用的按钮)


此处的详细信息:

默认情况下,大多数scene.ui元素上的变换由于性能原因设置为false,因此您需要使用任何容器或表进行相同的变换

TextButton button = new TextButton("Text Button", skin);
Container wrapper = new Container(button);
wrapper.setTransform(true);
wrapper.setOrigin(wrapper.getPrefWidth() / 2, wrapper.getPrefHeight() / 2);
wrapper.setRotation(45);
wrapper.setScaleX(1.5f);

您可以使用TweenAccessor中的容器,然后应用动画

public class ContainerAccessor implements TweenAccessor<Container> {

public static final int SCALE_XY = 3;

@Override
public int getValues(Container target, int tweenType, float[] returnValues) {
    switch (tweenType) {

        case SCALE_XY:
            returnValues[0] = target.getScaleX();
            returnValues[1] = target.getScaleY();
            return 2;

        default:
            assert false;
            return -1;
    }

}

@Override
public void setValues(Container target, int tweenType, float[] newValues) {
    switch (tweenType) {

        case SCALE_XY:
            target.setScale(newValues[0], newValues[1]);
            break;

        default:
            assert false;
    }

}
}
公共类ContainerAccessor实现TweenAccessor{
公共静态最终整数刻度_XY=3;
@凌驾
public int getValues(容器目标、int-tweenType、float[]返回值){
开关(二十种类型){
案例规模_XY:
returnValues[0]=target.getScaleX();
returnValues[1]=target.getScaleY();
返回2;
违约:
断言错误;
返回-1;
}
}
@凌驾
公共void setValues(容器目标、int-tweenType、float[]newValues){
开关(二十种类型){
案例规模_XY:
target.setScale(newValues[0],newValues[1]);
打破
违约:
断言错误;
}
}
}

太好了,那你就浪费了我们的时间!请张贴所有相关代码。。可能是.draw()方法在没有使用stage.updated答案(未测试)的情况下不使用scale。如果这不起作用,您需要一个stagebutton.setTransform(true);很好。但它只对字体进行缩放。背景仍然是。我需要为整个按钮制作动画,包括背景和字体。有什么建议吗?我试着从下载这个类,但是我正在使用的Libgdx版本缺少很多东西。为什么不将您的项目更新到Libgdx的最新版本?如果您依赖gradle,那么您可以轻松地将项目升级到最新版本。我尝试了多次更新.jar。但我一直收到这个错误:java.lang.NoClassDefFoundError:com.badlogic.gdx.backends.android.AndroidGL10在这个方法“initializeForView”上,我在整个应用程序中将GL10改为GL20。仍然会得到相同的错误.updateing.jar或.jars(libgdx有很多jar),因此它不会手动更新所有jar,只需在root
build.gradle
文件中更新版本并刷新项目,而是使用给定的verion自动更新到您的项目模块。
TextButton button = new TextButton("Text Button", skin);
Container wrapper = new Container(button);
wrapper.setTransform(true);
wrapper.setOrigin(wrapper.getPrefWidth() / 2, wrapper.getPrefHeight() / 2);
wrapper.setRotation(45);
wrapper.setScaleX(1.5f);
public class ContainerAccessor implements TweenAccessor<Container> {

public static final int SCALE_XY = 3;

@Override
public int getValues(Container target, int tweenType, float[] returnValues) {
    switch (tweenType) {

        case SCALE_XY:
            returnValues[0] = target.getScaleX();
            returnValues[1] = target.getScaleY();
            return 2;

        default:
            assert false;
            return -1;
    }

}

@Override
public void setValues(Container target, int tweenType, float[] newValues) {
    switch (tweenType) {

        case SCALE_XY:
            target.setScale(newValues[0], newValues[1]);
            break;

        default:
            assert false;
    }

}
}