1. 程式人生 > >【Android】動畫 —— view高度漸變的動畫

【Android】動畫 —— view高度漸變的動畫

【關鍵詞】

Android 高度 動畫

【問題】
  • 實現可見度為 gone 的 view ,高度從0變化到測量的高度;
  • 如果view 可見度為 gone, 直接通過 view.getHeight();得到的是0;
  • 雖然可以通過一個固定值來設定高度,但是如果高度設定的不準就會存在適配問題(應該有一種方法在gone的情況下也可以獲取到view的高度);
【效果圖】
【分析】
  • 找到一種方式可以在 可見度為 GONE 的情況下,也能獲取到準確的高度的方法,具體資訊參見最後【參考資料】;
【解決方案】
  • 如果是顯示:在動畫執行之前,設定可見性為 Visible; 獲取到要顯示到的最大高度,讓其高度通過動畫的方式逐漸變大;
  • 如果是隱藏:通過 view.getLayoutParam.height 獲取到當前顯示時的高度,讓其逐漸變化到0;動畫執行後設置可見性為GONE;
【程式碼】

使用方法:

// 顯示View vHead = findViewById(R.id.llyt_v_head);AnimatorUtil.animHeightToView(this, vHead,true,200);// 隱藏View vHead = findViewById(R.id.llyt_v_head);AnimatorUtil.animHeightToView(this, vHead,false,200);

幫助類

publicclassAnimatorUtil
{
// 高度漸變的動畫;publicstaticvoid animHeightToView(finalView v,finalint start,finalintend,finalboolean isToShow,long duration){ValueAnimator va =ValueAnimator.ofInt(start,end);finalViewGroup.LayoutParams layoutParams = v.getLayoutParams(); va.addUpdateListener(newValueAnimator.AnimatorUpdateListener
(){
@Overridepublicvoid onAnimationUpdate(ValueAnimator animation){int h =(int) animation.getAnimatedValue(); layoutParams.height = h; v.setLayoutParams(layoutParams); v.requestLayout();}}); va.addListener(newAnimatorListenerAdapter(){@Overridepublicvoid onAnimationStart(Animator animation){if(isToShow){ v.setVisibility(View.VISIBLE);}super.onAnimationStart(animation);}@Overridepublicvoid onAnimationEnd(Animator animation){super.onAnimationEnd(animation);if(!isToShow){ v.setVisibility(View.GONE);}}}); va.setDuration(duration); va.start();}publicstaticvoid animHeightToView(finalActivity context,finalView v,finalboolean isToShow,finallong duration){if(isToShow){// 顯示:通過上下文物件context獲取可見度屬性為 gone 的 view 的高度;Display display = context.getWindowManager().getDefaultDisplay();Point size =newPoint(); display.getSize(size); v.measure(size.x, size.y);intend= v.getMeasuredHeight(); animHeightToView(v,0,end, isToShow, duration);}else{// 隱藏:從當前高度變化到0,最後設定不可見; animHeightToView(v, v.getLayoutParams().height,0, isToShow, duration);}}
【擴充套件】
// WindowManager也可以直接通過Context獲取;WindowManager wm =(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDisplay();
【參考資料】
  • Android - 在View顯示前獲取其高度和寬度
    Android開發經常需要在Activity顯示前獲取某個View的高度和寬度,例如:程式需要在onCreate()方法中得到一個View的高度和寬度,或者需要知道一個VisibilityGoneView的高度和寬度。此時如果直接呼叫ViewgetWidth()和getHeight()方法,得到的結果是0原因是在上述情況中,View並沒有實際繪製,既然原因找到了,解決辦法也就有了,我們可以呼叫View.measure()方法,之後在獲取View.getMeasuredWidth()和View.getMeasuredHeight()。Display display = getWindowManager().getDefaultDisplay();Point size =newPoint();display.getSize(size);view.measure(size.x, size.y);int width = view.getMeasuredWidth();int height = view.getMeasuredHeight();