2011-04-11 132 views
1

我想使用Android动画框架计算随着时间的推移。但是,我创建的TranslateAnimations似乎总是表明它们在我对getTransformation进行的每次调用中都已结束,并且转换看起来不正确。在下面的代码,我希望以下日志输出行驶void1()和void2()后:2.5秒后100.0,1000.0(真)如何使用我自己的对象使用动画?

测试1::

试验1最初150.0,1500.0 (真)

试验2最初:100.0,1000.0(真)

试验2 2.5秒后:150.0,1500.0(真)

相反,我GE Ť这样的输出:

试验1最初:12.0,34.0(真)

试验1之后2.5秒:12.0,34.0(真)

试验2最初:0.0,0.0(真)

试验2后2.5秒:0.0,0.0(真)

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 + ")"); 
    } 

如何CA ñ我得到了我期待的结果?

+0

在测试1中,您设置了'newpts [] = {12,34}'。您如何期望它以不同的方式输出它,因为您不会在日志语句之前更改这些值? – Andreass 2011-04-11 08:17:45

+0

Matrix.mapPoints(newpts)有副作用(写入newpts)。 – Ben 2011-04-12 05:34:38

回答

1

上面的代码有两个问题 - 第一个是initialize()必须在TranslateAnimation返回getTransformation()的有效结果之前调用。第二个是getTransformation()返回Animation是否仍在运行,而不是它是否已停止。完成这两个更改后,代码将按需要工作。

0

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

+0

我可以,但我不知道这将如何帮助解决问题(这是在不同的答案中解决) - 问题是,Animation.getTransformation将始终表明动画已经结束,即使它仍然应该一直在。问题是必须在动画被使用之前调用Animation.initialize,并且我误解了getTransformation的返回值。 anim不需要重新初始化,因为它在test1和test2中是不同的对象。 – Ben 2011-04-14 04:32:47

+0

@Ben我很抱歉误解,很高兴你解决了它。 – 2011-04-14 18:13:03

相关问题