본문 바로가기
프로그래밍 놀이터/안드로이드, Java

Android Transition Animation (TransitionManager, Transition, Scene) Tutorial

by 돼지왕 왕돼지 2014. 4. 8.
반응형

Android Transition Animation (TransitionManager, Transition, Scene) Tutorial



Kitkat Transition Animation Tutorial


기본


참조 : http://blog.stylingandroid.com/archives/2143


Layout 의 변화에 대한 animation 을 지원한다.

Layout 에 add, remove, move, resize, show, hide 등에 대한 기본 animation 을 지원한다.


<LinearLayout

    android:id="@+id/layout_1"

    android:layout_width="fill_parent"

    android:layout_height="0dp"

    android:layout_weight="1"

    android:gravity="center"

    android:orientation="vertical"

    android:padding="@dimen/margin">

 

    <TextView

        android:id="@+id/item_1a"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:minHeight="@dimen/item_height"

        android:background="@color/red"

        android:text="Item 1a"

        android:gravity="center"

        android:textAppearance="@style/Text"

        android:layout_margin="@dimen/margin"/>

 

    <TextView

        android:id="@+id/item_1b"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:minHeight="@dimen/item_height"

        android:background="@color/green"

        android:text="Item 1b"

        android:gravity="center"

        android:textAppearance="@style/Text"

        android:layout_margin="@dimen/margin"/>

 

</LinearLayout>


private ViewGroup mLayout1;

 

@Override

public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_part1, container, false);

    mLayout1 = (ViewGroup) view.findViewById(R.id.layout_1);

    mLayout1.findViewById(R.id.item_1a).setOnClickListener(this);

    mLayout1.findViewById(R.id.item_1b).setOnClickListener(this);

    return view;

}

 

@Override

public void onClick(View v) {

    int selected = mLayout1.indexOfChild(v);

    TransitionManager.beginDelayedTransition(mLayout1, new ChangeBounds());

    mLayout1.removeView(v);

    mLayout1.addView(v, selected == 0 ? mLayout1.getChildCount() : 0);

}





TransitionManager.beginDelayedTransition( ViewGroup, Transition );


Transition 에 원하는 animation type 을 지정해주면, 내부에서 알아서 AnimatorSet 을 만들고 animation 을 수행한다.

Animation 을 수행하기 전에 view 의 id 를 기준으로 view 의 상태를 감시한 후 이를 바탕으로 animation 을 만든다.




Compat


https://github.com/guerwan/TransitionsBackport


Transition Backward Compat 을 위한 녀석.




Scene 정의하여 Scene 간의 Transition 하기


참조 : http://blog.stylingandroid.com/archives/2162


Scene 을 이용해서 Transition 을 할 수도 있다.

이는 Scene 을 static view hierarchy 로 정의한 후, 이들간의 transition 을 지원하는 것이다.


TransitionManager.setTransition( Scene fromScene, Scene toScene, Transition transition ); 


setTransition을 통해 Scene 간의 animation 을 정의한다.



Scene.getSceneForLayout( ViewGroup container, int displayLayoutId, Context context ); // Scene 생성

Scene.setEnterAction( Runnable runnable ); // 해당 Scene 이 Loading 되는 상태에서 불림.



Scene.enter(); // 해당 scene 을 display 한다.



TransitionManager.transitionTo( Scene toScene )


transitionTo 를 통해 현재 Scene 에서 다음 scene 으로 transition 한다.

이 때 TransitionManager.setTransition 에 define 한 Transition 이 사용된다.







Transition 의 종류


ChangeBounds() // add, remove

Fade() // visibility

AutoTransition() // auto


AutoTransition 은 TransitionSet 이다.


<AutoTransition 구현내용>

TransitionSet transition = new TransitionSet();

transition.setOrdering( TransitionSet.ORDERING_TOGETHER );

transition.addTransition( new Fade( Fade.OUT ) ).addTransition( new ChangeBounds() ).addTransition( new Fade( Fade.IN ) );





Parent 가 다른 경우에 대한 Transition


parent 가 달라지는 animation 의 경우에는 예상치 못한 이상한 반응이 나오기도 한다.


Transition.setReparent( boolean reparent );


reparent 가 되는 경우는 위의 명령으로 reparent 를 true 로 줘야 예상한 반응이 나온다.


아직 구현이 완벽히 되지 않은 Transition type 들도 있어서 계속 관찰해야 한다.






반응형

댓글