본문 바로가기

ANDROID

[안드로이드] 소숫점 조정된 double 변수로 ValueAnimator 사용하기

숫자가 변화하는 ValueAnimator를 기존에는 Int 변수에 사용하고 있었는데


이를 double 변수에도 사용할 일이 생겼다. 


사용할 일이 생겼다기보단 사용하고 싶은 욕구가 생겼다. 



어쨌거나


ValueAnimator를 사용하기 위해서 아래와 같은 코드, 그리고 과정을 거쳤다.





1. 먼저 ValueAnimator 객체를 생성한다. 



2. setObjectValues(시작값, 완료값) 을 설정한다.



3. addUpdateListener를 달아준다.


여기에서 textView를 참조해 textView가 표시하는 숫자를 다이나믹하게 변화시킬 수 있게 한다.



4.  setEvaluator를 달아준다.


setEvaluator를 스튜디오의 권유에 따라 자동으로 생성하고 나면


기본 evaluator의 return 값과 파라미터는 Object형으로 설정되어 있는 걸 확인할 수 있다.


즉 개발자 입맛에 따라 Obejct 하위의 다양한 변수유형을 ValueAnimator로 적용할 수 있을 것이라는


추측을 조금  해볼 수 있다.


아래에서는 본래 의도대로 double 변수를 animate하고자 TypeEvaluator 뒤에 <Double>을 달아주었고


evaluate 메소드의 리턴값, startValue와 endValue의 유형도 Double로,


마지막 리턴값도 물론 Double로 나오도록 했다.


여기서 조심할 점은 fraction은 float 값으로 계산되기 때문에 자료유형을 어떻게 변경해주느냐 따라


캐스팅을 어떻게 할 지 잘 고려해야 한다. 


이게 잘 맞지 않을 때 애니메이션 수행시 nullPointerException등의 오류가 발생할 수 있음.



5. setDuration으로 애니메이션이 수행 될 총 시간을 정한다.


+ 여기에 필요에 따라 setStartDelay로 애니메이션의 시작 이전 딜레이를 정해줄 수 있다. (Animation의 setStartOffset과 동일)



6. start로 원하는 부분에서 애니메이션을 수행한다.



여기서 눈여겨 볼 점은 단순하게 double 변수만을 setObjectValues에 넣고, evaluator 내부에도 


기본 return 유형대로 내버려두면


double 변수가 값이 증가하면서 소숫점 아래 무수하게 많은 수를 출력하기 때문에


정한 레이아웃에 따라 마지막에 써붙인 값이 출력되지 않을 수도 있고


그냥 상식적으로 매우 지저분해 보일 수 있다.


그런데서 double 변수를 소숫점 두자리 까지만 표시하고, animation도 동일하게 소숫점 두자리 안에서 적용되도록


아래와 같이 손을 봐 주었다.



setObjectValues에 넣을 최종 double 값, 


setEvaluator 내부의 evaluate 메소드의 리턴 값을


Math.round(기존 double 변수 * 100) / 100.0d;


로 감싸줌으로써 의도대로 애니메이션을 적용시킬 수 있었다.





< 참조 > 


https://stackoverflow.com/questions/39486395/valueanimator-for-count-up-effect-on-android-textview?rq=1


https://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places-in-java