【Android】動畫 —— view高度漸變的動畫
阿新 • • 發佈:2019-02-13
【關鍵詞】
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 (){
@Override
publicvoid onAnimationUpdate(ValueAnimator animation){
int h =(int) animation.getAnimatedValue();
layoutParams.height = h;
v.setLayoutParams(layoutParams);
v.requestLayout();
}
});
va.addListener(newAnimatorListenerAdapter(){
@Override
publicvoid onAnimationStart(Animator animation){
if(isToShow){
v.setVisibility(View.VISIBLE);
}
super.onAnimationStart(animation);
}
@Override
publicvoid 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的高度和寬度,或者需要知道一個Visibility為Gone的View的高度和寬度。此時如果直接呼叫View的getWidth()和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();