参考我以前的一篇博客,从底部弹出菜单,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; } }); }