【问题标题】:Universal Tween Engine for android安卓通用补间引擎
【发布时间】:2012-05-22 09:52:05
【问题描述】:

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

【问题讨论】:

    标签: android android-animation tween android-resources


    【解决方案1】:

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

    在大多数情况下,您应该使用TweenManager 来处理所有补间的更新过程。因此,您需要做的就是在每一帧上调用管理器的.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 主线程中完成,因此您不会遇到任何同步问题。

    除了游戏之外,我从未尝试过将引擎用于其他任何东西,但这个解决方案应该可以正常工作。

    【讨论】:

    • 感谢 Aurélien Ribon 的宝贵意见,我会试试看。我可以使用这个翻译位图图像并在这个线程中调用 Tween.to() 吗?
    • 使用这个,你可以在任何东西(位图图像​​或其他)上应用补间,只要你为每个你想要动画的类注册一个 TweenAccessor。然后,您可以从 UI 线程(Android 主线程)调用 Tween.to()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    相关资源
    最近更新 更多