2012-08-13 3 views
22

저는 일부 버튼과 텍스트 뷰의 컨테이너로 사용하는 LinearLayout을 가지고 있는데, 높이를 움직이게하여 사용자가 " 표시 "버튼을 누릅니다.ValueAnimator가있는 LinearLayout 컨테이너의 높이의 애니메이션

내 xml에서 LinearLayout을 layout_height = "0dp"로 설정하고 visibility = "gone"으로 설정했습니다. 그런 다음 내용을 감싸는 데 필요한 높이를 표시하도록 설정합니다. 지금은 전혀 애니메이션을 적용하는 데 문제가있어 랩 콘텐츠의 높이가 걱정되지 않습니다. 아마도 문제는 내가있는 LinearLayout의 높이를 설정하고 어떻게

private void toggle(final LinearLayout v) { 
    v.setVisibility(View.VISIBLE); 
    ValueAnimator va = ValueAnimator.ofInt(0, 300); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.invalidate(); 

     } 
    }); 

    va.start(); 
} 

:

여기에 생기를 내 방법입니까? 아니면 ValueAnimator의 기능을 오해하고 있습니까? Chet Haase의 블로그 게시물을 둘러 보았지만 구체적인 높이 애니메이션 예제는 포함되어 있지 않습니다. 나도 3.0+에서 API를 사용하여 높이의 애니메이션 작업 방법을 찾아 낼 수 없었습니다. 이 덕분에 도움이 될 것입니다, 감사합니다!

+0

레이아웃 애니메이션을 사용하지 않는 이유는 무엇입니까? –

+0

솔직히 나는 그것을 사용하는 방법에 대해 전혀 몰라서 새로운 API 버전을 겨냥하고 있기 때문에 더 새로운 클래스를 사용하는 것이 더 간단 할 것이라고 생각했습니다 ... 저는 LayoutAnimation으로 어떻게 할 것인지 계속 살펴볼 것입니다. 당신이 그것을하는 방법에 대한 아이디어가 있다면 더 나은 해결책으로 그것을 게시 할 자유롭게 :) – span

+0

무효화에 어떤 이유가 있습니까? – portfoliobuilder

답변

57

이 블로그 게시물을보고 : http://tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/view.invalidate() 레이아웃을 다시 그려야한다고 알았습니다. view.requestLayout()을 사용해야합니다.

ValueAnimator va = ValueAnimator.ofInt(0, height); 
    va.setDuration(700); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.requestLayout(); 
     } 
    }); 

난 그냥 애니메이션 동적 할뿐만 아니라있는 LinearLayout의 높이를 얻는 방법에 메모를 추가하고 싶었 :

따라서 코드는 다음과 같이된다. 높이를 얻으려면 모든 견해를 먼저 그려야합니다. 우리는 그 그림이 끝났음을 알려주는 사건을 경청해야합니다. 이것은 다음과 같은 onResume() 메소드에서 수행 할 수 있습니다 (필자는 필자가 xml에서 높이에 대해 wrap_content에 컨테이너를 선언했음을 알 수 있습니다. 시작부터 숨기고 싶기 때문에 볼 수 있습니다).

@Override 
    public void onResume() { 
     super.onResume(); 
     final ViewTreeObserver vto = filterContainer.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       height = filterContainer.getHeight(); 
       filterContainer.setVisibility(View.GONE); 
       filterContainer.getLayoutParams().height = 0; 
       filterContainer.requestLayout(); 
       ViewTreeObserver obs = filterContainer.getViewTreeObserver(); 
       obs.removeGlobalOnLayoutListener(this); 
      } 
     }); 
    } 
+3

이것은 getAnimatedValue를 사용하는 방법을 이해하는 데 도움이되었습니다. 감사합니다. – speedynomads

+0

가치 애니메이터의 개선 된 작업은 지정된 지속 시간 동안 시작점과 종점 사이의 중간 값을 취하고 목적지 높이에 도달 할 때까지 중간 값으로 레이아웃 높이를 업데이트 할 수 있습니다. 또한 애니메이션은 매우 부드럽습니다. 감사합니다. –

+0

대단히 감사합니다! 대답의 두 번째 부분은 많은 도움이됩니다! – Victor

관련 문제