2011-04-11 7 views
1

Android 애니메이션 프레임 워크를 사용하여 시간 경과에 따른 움직임을 계산하고 싶습니다. 그러나 내가 만드는 TranslateAnimations는 항상 getTransformation을 호출 할 때마다 끝났음을 나타내므로 변형이 올바르지 않게 표시됩니다. 2.5 초 후에 100.0, 1000.0 (참)내 개체와 함께 애니메이션을 사용하려면 어떻게해야합니까?

테스트 1 :

시험 초기에는 1 : 아래의 코드에서, 나는 void1()와 void2()를 실행 한 후 다음과 같은 로그 출력을 기대 150.0, 1500.0 2.5 초 후 100.0, 1000.0 (참)

테스트 2 : 처음에 (참)

시험이 150.0, 1500.0 (참) 대신

, I GE

시험 초기에는 1 : 12.0, 34.0 (TRUE)

테스트 1 2.5 초 후에이 출력을 t 12.0, 34.0 (TRUE)

시험 2 초기 ​​: 0.0, 0.0 (TRUE)

테스트 2 2.5 초 후 : 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 + ")"); 
    } 

방법 캘리포니아 n 내가 기대하는 결과를 얻었습니까?

+0

테스트 1에서는 'newpts [] = {12, 34}'로 설정했습니다. 로그 문 앞에 값을 변경하지 않으므로 어떻게 다르게 출력 할 것으로 예상합니까? – Andreass

+0

Matrix.mapPoints (newpts)에는 부작용이 있습니다 (newpts에 쓰십시오). – Ben

답변

1

위의 코드에는 두 가지 문제가 있습니다. 첫 번째는 TranslateAnimation이 getTransformation()에 대한 유효한 결과를 반환하기 전에 initialize()를 호출해야한다는 것입니다. 두 번째는 getTransformation()이 애니메이션이 아직 실행 중인지 여부를 반환하고 중지 여부를 반환하지 않습니다. 이 두 가지 변경을 한 후에 코드는 원하는대로 작동합니다.

0

간단하게 implement AnimationListener을 사용할 수 없습니까? onAnimationEnd() 내에서 테스트를 수행하는 동안 다시 초기화 할 수 있습니까?

+0

그럴 수는 있겠지만 문제 해결에 도움이되는 방법을 모르겠습니다. 문제는 Animation.getTransformation은 애니메이션이 이미 종료되었음을 나타냅니다. 간다. 문제는 애니메이션을 사용할 수 있기 전에 Animation.initialize를 호출해야하고 getTransformation의 반환 값을 잘못 해석 한 것입니다. anim은 test1과 test2에서 다른 객체이기 때문에 다시 초기화 할 필요가 없습니다. – Ben

+0

@Ben 오해에 대해 사과드립니다. 다행스럽게도 해결해 주셨습니다. –

관련 문제