【问题标题】:How can I use an Animation with my own objects?如何将动画与我自己的对象一起使用?
【发布时间】:2011-04-11 02:35:53
【问题描述】:

我想使用 Android 动画框架来计算随时间的运动。但是,我创建的 TranslateAnimations 似乎总是表明它们在我对 getTransformation 的每次调用中都已结束,并且 Transformation 似乎不正确。在下面的代码中,我希望在运行 void1() 和 void2() 后出现以下日志输出:

初始测试 1:100.0、1000.0(真)

2.5 秒后测试 1:150.0、1500.0(真)

测试 2 最初:100.0、1000.0(真)

2.5 秒后测试 2:150.0、1500.0(真)

相反,我得到了这个输出:

测试 1 最初:12.0、34.0 (true)

2.5 秒后测试 1:12.0、34.0(真)

测试 2 最初:0.0、0.0(真)

2.5 秒后测试 2:0.0, 0.0 (true)

void test1() {
        Animation anim = new TranslateAnimation(100, 1000, 200, 2000);
        anim.setFillAfter(true);
        anim.setFillBefore(true);
        anim.setDuration(5000);
        anim.startNow();

        Transformation t = new Transformation();
        boolean hasended = anim.getTransformation(AnimationUtils.currentAnimationTimeMillis(), t);
        float newpts[] = {12, 34};
        t.getMatrix().mapPoints(newpts);
        Log.v("AnimationTest", "Test 1 initially: " + newpts[0] + ", " + newpts[1] + " (" + hasended + ")");

        long target = System.currentTimeMillis() + 2500;
        while (System.currentTimeMillis() < target)
            System.gc();

        hasended = anim.getTransformation(AnimationUtils.currentAnimationTimeMillis(), t);
        t.getMatrix().mapPoints(newpts);
        Log.v("AnimationTest", "Test 1 after 2.5 seconds: " + newpts[0] + ", " + newpts[1] + " (" + hasended + ")");
    }

    void test2() {
        Animation anim = new TranslateAnimation(100, 1000, 200, 2000);
        anim.setFillAfter(true);
        anim.setFillBefore(true);
        anim.setDuration(5000);
        anim.startNow();

        //Based on http://stackoverflow.com/questions/4112599/android-how-to-stop-animation-cancel-does-not-work
        Transformation t = new Transformation();
        boolean hasended = anim.getTransformation(AnimationUtils.currentAnimationTimeMillis(), t);
        Matrix transformationMatrix = t.getMatrix();
        float[] matrixValues = new float[9];
        transformationMatrix.getValues(matrixValues);
        float transX = matrixValues[Matrix.MTRANS_X];
        float transY = matrixValues[Matrix.MTRANS_Y];
        Log.v("AnimationTest", "Test 2 initially: " + transX + ", " + transY + " (" + hasended + ")");

        long target = System.currentTimeMillis() + 2500;
        while (System.currentTimeMillis() < target)
            System.gc();

        hasended = anim.getTransformation(AnimationUtils.currentAnimationTimeMillis(), t);
        transformationMatrix = t.getMatrix();
        transformationMatrix.getValues(matrixValues);
        transX = matrixValues[Matrix.MTRANS_X];
        transY = matrixValues[Matrix.MTRANS_Y];
        Log.v("AnimationTest", "Test 2 after 2.5 seconds: " + transX + ", " + transY + " (" + hasended + ")");
    }

我怎样才能得到我期望的结果?

【问题讨论】:

  • 在测试 1 中,您设置了 'newpts[] = {12, 34}'。由于您没有更改日志语句之前的值,您如何期望它以不同的方式输出它?
  • Matrix.mapPoints(newpts) 有副作用(写入 newpts)。

标签: android animation


【解决方案1】:

上面的代码有两个问题——第一个是必须在 TranslateAnimation 为 getTransformation() 返回有效结果之前调用 initialize()。第二个是getTransformation()返回的是Animation是否还在运行,而不是它是否已经停止。进行这两项更改后,代码可以正常工作。

【讨论】:

    【解决方案2】:

    你不能简单地implement AnimationListener 吗?在onAnimationEnd() 中,您可以重新初始化它们或在测试之间您需要做什么?

    【讨论】:

    • 我可以,但我不确定这将如何解决问题(在不同的答案中解决) - 问题是 Animation.getTransformation 总是表明动画已经结束,即使它应该还在继续。问题是必须在使用动画之前调用 Animation.initialize,而我误解了 getTransformation 的返回值。 anim 不需要重新初始化,因为它在 test1 和 test2 中是不同的对象。
    • @Ben 对我的误解深表歉意,很高兴你解决了它。
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多