【发布时间】: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)。