适用于Android的通用Tween引擎

时间:2012-05-22 09:52:06

标签: android android-animation tween android-resources

我可以使用Universal Tween Engine for android补间动画吗?

Tween.to(getResources().getDrawable(R.drawable.ic_launcher),  ParticleAccessor.POSITION_XY, 0.5f)
     .target(0, 0)
     .ease(Bounce.OUT)
     .delay(1.0f)
     .repeatYoyo(2, 0.5f)
     .start(manager);

我已从wiki页面复制此代码,并将目标更改为可绘制资源。如何将此drawable更改为Target Object?

1 个答案:

答案 0 :(得分:5)

Universal Tween Engine唯一能够计算任何内容的要求是您创建的TweensTimelines会定期更新(在每一帧上)。

在大多数情况下,您应该使用TweenManager来处理所有补间的更新过程。因此,您需要做的就是在每个帧上调用管理器的.update()方法。对于安卓游戏来说,这很容易做到,因为每个游戏都有一个“游戏循环”,一个无限循环,可以在每个帧上重新计算和重绘世界。因此,您需要做的就是在此循环中插入管理器更新调用,并且瞧。但是,纯Android UI应用程序不会公开它们的循环,因此您不能只在任何地方插入更新调用。

然而,你应该做的是在其中创建一个带有无限循环的单独线程,并将manager.update()方法放在其中。它应该毫不费力地工作:)

首先,你需要在某个地方创建一个经理:

private final TweenManager tweenManager = new TweenManager();

除了用于停止动画的onPause()方法中的动画的布尔值:

private boolean isAnimationRunning = true;

然后你需要创建线程(例如在Activity构造函数中):

new Thread(new Runnable() {
    private long lastMillis = -1;

    @Override
    public void run() {
        while (isAnimationRunning) {
            if (lastMillis > 0) {
                long currentMillis = System.currentTimeMillis();
                final float delta = (currentMillis - lastMillis) / 1000f;

                view.post(new Runnable() {) {
                    @Override public void run() {
                        tweenManager.update(delta);
                    }
                };

                lastMillis = currentMillis;
            } else {
                lastMillis = System.currentTimeMillis();
            }

            try {
                Thread.sleep(1000/60);
            } catch(InterruptedException ex) {
            }
        }
    }
}).start();

然后,您可以在Android UI代码中的任何位置创建补间。您可以看到更新调用被view.post()包围,因此更新将在主Android UI线程中完成,因此您不会遇到任何同步问题。

我从来没有尝试过除了游戏以外的其他任何引擎,但这个解决方案应该没有任何问题。