2

我可以将通用补间引擎用于 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 页面复制此代码并将目标更改为可绘制资源。如何将此可绘制对象更改为目标对象?

4

1 回答 1

5

通用补间引擎能够计算任何内容的唯一要求是您创建的和Tweens定期Timelines更新(在每一帧上)。

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

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

首先,您需要在某处创建一个经理:

private final TweenManager tweenManager = new TweenManager();

以及用于停止 ativity 的 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 线程中完成,因此您不会遇到任何同步问题。

除了游戏之外,我从未尝试过引擎,但这个解决方案应该可以正常工作。

于 2012-05-23T06:12:23.853 回答