參考我以前的一篇博客,從底部彈出菜單,https://my.oschina.net/u/1462828/blog/866372java
如今我要優化這個現實效果,主要實現兩點,1是底部菜單彈出來,2是背景半透明的黑色慢慢顯現,即透明度0-1;android
代碼很簡單,就很少囉嗦了。ide
首先上工具類:工具
import android.animation.ValueAnimator; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import com.imxiaoyu.common.impl.OnBooleanListener; /** * 動畫輔助類 * Created by XiaoYu on 2017/3/23. */ public class AnimatorUtils { /** * y軸漸變大小動畫 * @param v * @param start * @param end */ public void startMove(View v, int start, int end) { startMove(v, start, end, null); } public void startMove(View v, int start, int end, final OnBooleanListener onBooleanListener) { ValueAnimator animator = createDropAnimator(v, start, end, onBooleanListener); animator.setDuration(300);//動畫播放的時間 animator.start(); } private ValueAnimator createDropAnimator(final View v, final int start, final int end, final OnBooleanListener onBooleanListener) { ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator arg0) { int value = (int) arg0.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); layoutParams.height = value; v.setLayoutParams(layoutParams); if(value==end) { //動畫執行結束了 if (onBooleanListener != null) { onBooleanListener.onClick(true); } } } }); return animator; } /** * 淡入淡出動畫 */ public void startFadeInFadeOut(View view,float start,float end){ if (null == view ) { return; } AlphaAnimation mHideAnimation = new AlphaAnimation(start, end); mHideAnimation.setDuration(300); mHideAnimation.setFillAfter(true); view.startAnimation(mHideAnimation); } }
而後是重寫popupwindow的show方法和dismiss方法優化
public void show() { super.show(); animatorUtils.startFadeInFadeOut(vBg, 0.0f, 1.0f);//背景漸變 animatorUtils.startMove(llyMenu, 0, DensityUtils.dip2px(getActivity(), 456)); } public void dismiss() { if(isClose==true){ //當前是否正在隱藏,避免屢次觸發動畫 return; } isClose=true; animatorUtils.startFadeInFadeOut(vBg, 1.0f, 0.0f);//背景漸變 animatorUtils.startMove(llyMenu, DensityUtils.dip2px(getActivity(), 456), 0, new OnBooleanListener() { @Override public void onClick(boolean bln) { UtilsMenuPopupWindow.super.dismiss(); //動畫播放完了再隱藏 isClose=false; } }); }