본문 바로가기

프로그래밍/Android

Data Animation???

 

android의 view Animation은 canvas에 view를 그리기전 

시간간격에 따라 Transformation의 Matrix를 변경하는 구조로 이루어져 있다.

 

Animation 객체를 상속받아 커스텀 애니메이션을 만들 경우

applyTransformation( float interpolatedTime, Transformation t); 메쏘드를 구현해 주면,

해당 변형이 이루어지게 된다.

 

대략의 흐름을 살펴보면,

View.draw() -> layout인 경우 dispatchDraw()가 호출된다.

이곳에서 배경을 그리고, 각 child view draw() 호출하게 되는데,

호출전 child view 에 Animation이 설정되어 있으면, 

해당 Animation의 getTransformation()으로

적용될 Transformation을 가져와 적용하게 된다.

 

getTransformation() 메쏘드는 

내부적으로 시간계산 및 시작,종료 처리 등의 작업을 하고, 실제 변경은

applyTransformation() 메쏘드를 호출하여 이루어진다.

(에니메이션이 없는 경우는 ViewGroup 의 static child transformation 설정에 따라

getChildStaticTransformation() 을 호출한다. )

 

그 이후는 위의 transform을 캔바스에 설정하고, 각 child의 draw()를 호출하게 된다.

 

결국, applyTransformation()을 오버라이드해 이용하면, UI 쓰레드에서 

변화하는 값들을 설정하거나 얻을 수 있게 된다.

 

예를 들어 1부터 100까지 1초동안 값을 변경하는 애니메이션을 생각해 보자.

별도의 변형은 필요없고, 순수 데이터의 변화량만 얻고 싶다.

이 얻어진 변화량으로 onDraw()에서 직접 무언가를 그리는 작업.

 

대강 아래와 같이 작성하면 되지 않을까? 

(블로그에서 타이핑 한 것이라 실제 구동되는 소스코드 아님...)

 

public class CountAnimation extneds Animation {

  private float fromX;

  private float toX;

 

  // 변화량을 전달하기 위한 리스너를 추가한다.

  private OnCountListener mListener;

  public interface OnCountListener {

     public abstract void onChanged( float x );

  };

 

  public CountAnimation( float from, float to ) {

    fromX = from;

    toX = to;

  }

 

  public void setListener( OnCountListener listener ) {

    mListener = listener;

  }

 

  // Transformation 고려치 않고, 값만 적용해서 리스너에 전달

  protected void applyTransformation( float interpolatedTime,

Transformation t ) {

    float dx = fromX;

 

   if( fromX != toX ) {

     dx = fromX + ( (toX - fromX) * interpolatedTime );

   }

 

   if( mListener != null ) {

      mListener.onChanged( dx );

   }

}

 

이처럼 작성후 View에 setAnimation() 하고, 리스너를 구현해 주면

값이 onChanged() 메쏘드로 넘어오게 된다. 

 

이값을 별도로 저장해서 onDraw() 등에 필요한 형태로 사용하면....

대강 머리속으로 구현한 것이라 아마도 될 듯... 

 

뭐 그냥 그렇다.. -_-;; 

언젠가는 사용할일이 있것지...

'프로그래밍 > Android' 카테고리의 다른 글

Dialog  (0) 2013.02.22
Fragment 기본  (0) 2012.12.28
EditText 특수문자 입력 제한  (0) 2012.09.10
앱 연동  (0) 2012.07.27
Parcelable  (0) 2012.05.22
Assets 폴더의 이미지 읽기  (0) 2012.03.15
JSON  (0) 2012.01.31
HTTP POST/GET 몇가지 정리  (0) 2012.01.30
OpenGL es 조명  (0) 2011.12.07
API demos openGL es 2.0  (0) 2011.11.21