适用于Android的通用Tween引擎

i l*_*eaf 2 android tween android-animation 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);
Run Code Online (Sandbox Code Playgroud)

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

Aur*_*bon 5

通用吐温引擎唯一的要求是能够计算什么是,TweensTimelines您创建的定期更新(每一帧).

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

但是你应该做的是创建一个单独的线程,里面有一个无限循环,并将manager.update()方法放在其中.它应该没有微风:)

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

private final TweenManager tweenManager = new TweenManager();
Run Code Online (Sandbox Code Playgroud)

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

private boolean isAnimationRunning = true;
Run Code Online (Sandbox Code Playgroud)

然后你需要创建线程(例如在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();
Run Code Online (Sandbox Code Playgroud)

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

除了游戏之外,我从未尝试过引擎,但这个解决方案应该没有任何问题.