參考我之前的一篇博客,從底部彈出菜單,https://my.oschina.net/u/1462828/blog/866372
現在我要優化這個現實效果,主要實現兩點,1是底部菜單彈出來,2是背景半透明的黑色慢慢顯現,即透明度0-1;
代碼很簡單,就不多囉嗦了。
首先上工具類:
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;
}
});
}