2012-08-13 85 views
22

我有一個LinearLayout,我用它作爲一些按鈕和textview的容器,我想動畫的高度給人一種印象,當用戶按下「顯示「按鈕。ValueAnimator的LinearLayout容器的高度動畫

我已經在我的xml中將LinearLayout設置爲layout_height =「0dp」和visibility =「gone」。然後,我希望將其設置爲可見,並且無論高度需要包裝內容。目前我有問題,甚至動畫它,永遠不知道包裝內容的高度。

這裏是我的動畫製作方法:

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(); 
} 

也許問題是我如何設置的LinearLayout的高度?或者我誤解了ValueAnimator的功能?我查看了Chet Haase的博客文章,但他們沒有包含任何具體的高度動畫示例。我也無法找到如何使用3.0+以上的API來處理高度動畫的好例子。希望對此有所幫助,謝謝!

+0

爲什麼不只是使用佈局動畫? – 2012-08-13 13:30:51

+0

坦率地說,我不知道如何使用它,我認爲,因爲我只針對API的更新版本,所以使用更新的類會更簡單......我將繼續研究如何使用LayoutAnimation實現,如果你有一個想法如何做到這一點,隨時發佈它作爲一個更好的解決方案:) – span 2012-08-13 13:34:35

+0

是否有任何理由失效? – portfoliobuilder 2016-09-23 00:01:47

回答

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 2013-09-04 12:17:04

+0

值得關注的動畫工具的更好的工作是它將在指定的持續時間內取得開始和結束點之間的中間值,並且我們可以通過該中間值更新我們的佈局高度,直到我們到達目的地高度。動畫也非常流暢。謝謝。 – 2016-01-14 13:11:00

+0

非常感謝!答案的第二部分幫助我很多! – Victor 2016-12-21 15:26:28