상세 컨텐츠

본문 제목

layout animation 처리할때 참고

program/Code Tip

by seongchan 2013. 9. 3. 13:03

본문

구글플러스에서 페이지 스크롤 방향에 따라서 하단 메뉴가 사라졌다, 나타났다.. 하는 부분에는 애니메이션을 쓴다.

아래는 연습삼아 하다가 나중에도 참고해야 할듯해서 몇가지 기록을 남긴다.


Framelayout에 지정된 임의의 ViewGroup(View도 무방..)에 애니메이션 효과를 줄때에 다음과 같이 보통 코딩을 한다.

(아래 박스 참고. 이 코드는 예시라서.. 코드 형태 참고만..)


여기서 주의할 점은..

TranslateAnimation(

 - 현재 View가 위치한 기준으로 이동할 위치를 지정한다. 이 값은 from ~ to 형태이니, 처음 시작할 위치와 끝날 위치 기준으로 잡아주면 된다.

strartAnimation() 

 - 현재 View(ViewGroup)이 VISIBLE이든, GONE이든간에 애니메이션 동작할때는 View는 노출이 된다.

애니메이션이 종료가 되는 시점에 (onAnimationEnd() 호출 시)에 해당 View를 노출할지 여부를 지정하면 된다.


 * 좌측 슬라이딩 메뉴의 경우에 view.layout()으로 화면을 재정의 하는 경우가 있긴 한데, z-order상으로 최상위에 layer를 구성하고, 최상위 layer만 이동하는 경우는 layout()을 할 필요가 없다. (이건 상황마다 다를 듯)

이 부분에 대해서는 단말내 환경설정 - 개발자옵션 - 표면 업데이트 표시를 체크해서 view가 어떻게 변하는가를 확인해 보면서 필요한 사항을 맞춰서 코딩해 보자. 내 경우는 구글플러스 앱의 경우를 따랐다.(실제 코드 말고 동작 상황)



  Animation ani;

  // 코드 중략...


  ani = new TranslateAnimation(0,0, 0, viewGroup2_height);

  ani.setDuration(500);            // 애니메이션 구동 주기 (500ms)

  ani.setAnimationListener(new menuAnimation());    // 애니메이션 리스너 등록

  ani.setFillAfter(true);          // 애니메이션 후에 View 처리하도록 설정

  menu.startAnimation(ani);    // 돌아라.. 애니메이션 





  public class menuAnimation implements AnimationListener {


/* onAnimationEnd()

 * 애니메이션이 종료될때에 호출된다.

 * 보통 이 부분에 애니메이션이 끝난 후에 View를 어떻게 할지를 결정한다.

 * 상황에 따라서 다르긴 한데, 애니메이션이 끝난 후에 보이는 View를 그대로 노출할지 (View.VISIBLE),

 * 안보이게 할지 (View.GONE)를 설정하게 된다. 

 * 밀려가는 View가 아닌 오버랩 되어서 위에 layer가 움직이는 경우라면 별도로 view.layout() method를 사용할 필요는 없다.)

 */

@Override

public void onAnimationEnd(Animation animation) {

          // TODO Auto-generated method stub

          Log.d("TAG""onAnimationEnd called");

            

          if (menu_slide_flag) {

              menu.setVisibility(View.GONE);

              Log.d(TAG"onAnimationEnd 1");

          } else {

        menu.setVisibility(View.VISIBLE);

              Log.d(TAG"onAnimationEnd 2");

          }

          menu_slide_flag = !menu_slide_flag;

          menu.clearAnimation();

    lock_flag = false;

      }


/* onAnimationRepeat()

 * 애니메이션이 동작할때에 호출된다.

 * 애니메이션 중간 과정에 필요한 사항이 있으면 이 부분에 코드를 넣는다.

 */

      @Override

      public void onAnimationRepeat(Animation animation) {

            // TODO Auto-generated method stub

            Log.d(TAG"onAnimationRepeat");

      }


/* onAnimationStart()

 * 애니메이션이 시작될때에 호출된다.

 * 내 경우는 애니메이션 중에 다시 애니메이션 start되는 것을 막기 위해서 lock_flag를 여기에 설정을 했다.

 * 물론 lock걸어둔 건 onAnimationEnd()에서 풀어줘야 한다.

 */

      @Override

      public void onAnimationStart(Animation animation) {

          // TODO Auto-generated method stub

          Log.d(TAG"onAnimationStart");

    lock_flag=true;

      }

} 







관련글 더보기

댓글 영역