본문 바로가기

안드로이드

안드로이드 AnimationDrawable 은 언제 시작하지?

안드로이드 AnimationDrawable 은 언제 시작하지?  안드로이드

2010/02/28 19:44

복사http://huewu.blog.me/110081670181

 안드로이드 GUI 개발 할 때 감탄하는 부분 중 하나는, Drawable 기능입니다.  Drawable 은 단순히 Bitmap 만을 나타내지 않고 한층 더 추상화된 개념. 그릴 수 있는 무언가를 상징합니다. XML 형식으로 정의된 Animation, Selector 또는 9-Patch 등의 요소를 손쉽게 GUI 와 결합 할 수 있게 해주지요.

 이전에 GUI 어플리케이션을 작성할 때, 디자이너가 동그라미가 회전하는 Animation 이나 모서리가 둥근 Window 등, 어찌 보면 단순한 효과들을 요청했을 때도, 제법 많은 양의 코드를 작성해야 했었고, 혹시라도 개별 Animation 을 제어하는 부분에 버그가 있지는 않을까 걱정 하기도 했었고, 결정적으로 어느날 갑자기 Animation 의 종류가 바뀌어 버리거나 하면 우울해 하던 기억이 있습니다. .안드로이드에서라면? 단순히 XML 값을 수정하기만 하면 작업 끝. 코드를 수정할 필요 조차 없는 경우가 많습니다. 

<애니매이션도 Drawable 이다>

 하지만 편리한 Drawable 중에서도  좀 속을 썩인 녀석이 있습니다. 애니매이션을 표현하는 데 사용하는 AnimationDrawable 입니다. 어떤 애니매이션을 설정하는 것은 간단히 XML 을 작성하는 것으로 가능한데, 작성한 애니매이션을 원하는 시점에 시작하거나, 원하는 방법으로 움직이게 하는 일에는 주의해야 할 점이 하나 있습니다. 애니매이션을 시작하는 방법에 관해서 입니다.

public void start ()

Since: API Level 1

Starts the animation, looping if necessary. This method has no effect if the animation is running.

 안드로이드 개발 문서에서 AnimationDrawble 에 관한 항목에는 start() API 에대 위와 같이 설명되어 있습니다. 하지만 실재로 코드 상에서 AnimationDrawable 을 생성한 후, start() API 를 호출 하니 애니매이션이 작동하지 않더군요. 한가지 문제가 있었습니다. API 문서가 아닌, 개발자 가이드의 2D 그래픽 관련 부분 맨 마지막 부분에 주의 사항이 나와있습니다. 

 친절히, AnimationDrawable 을 Window 에 완적히 붙기 전에 start 를 호출 하지 말라고 되어 있더군요. onCreate (onResume 도 마찬가지) 에서 호출해봤자 작동 하지 않으니, 힘 빼지 말고onWindowFocusChanged 에서 호출하라고 말입니다. 


 저 같은 경우, 애니매이션이 작동하지 않는 이유는 View 가 완전히 생성되기 전이라서 그럴꺼다 하고, 대충 예상은 하고 있었지만, 정확히 어떤 시점에서 start() API 를 호출 해야 하는지 알지 못해서, 애니매이션 시작을 아예 별도의 thread 에서 하거나, delayedMessage 를 사용 하는 등 여러가지 꽁수를 쓰기도 했습니다. 하지만 그럴 필요 없이 onWindowFocusChanged 시점에 호출하니 정상적으로 애니매이션이 움직였습니다. (부지런한 구글링만이 코드가 짧아지는 지름길 입니다.)


 ps. 한 가지 더 조심할 점을 덧 붙이자면, start 중인 AnimationDrawable 은 다시금 start 를 호출해도 아무런 일을 하지 않기 때문에... onWindowFocusChanged() 가 호출 되기 전에, onCreate() 나 onResume() 에서 start 를 호출 하면, 애니매이션이 움직이지 않게 됩니다.