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 |