盒子
盒子
文章目录
  1. 动画问题
    1. setAnimationStyle
    2. View动画
  2. 问题解决方案
    1. 背景渐变

略坑的PopupWindow

其实PopupWindow平时开发中我个人用的并不多,当想写一个底部弹出的菜单的时候,发现这并不是随手就来的事情。我的需求也很简单,就是底部位移弹出菜单,背景随之变暗。实际操作有不少问题需要解决

动画问题

setAnimationStyle

PopupWindow的动画可以通过setAnimationStyle()函数设置一个动画Style,需要到资源文件中定义,同时还需要在anim文件夹中定义好动画文件

问题:当定义了Translate的动画的时候,背景无法变暗

View动画

可以通过对PopupWindow中的View直接做Translate动画,setAnimationStyle()可以设置alpha动画,这样来实现背景渐变

问题:PopupWindow弹出的时候会卡一下,导致位移动画不能流畅运行,原因就是同时设置了setAnimationStyle()与View动画。这也是我们的项目中目前存在的问题

问题解决方案

既然同时设置setAnimationStyle()与View动画有问题,那只能换种方式了,View动画我们可以保留,因为可以针对PopupWindow做各种其他的动画,自由性高点。setAnimationStyle()可以直接撇掉。背景渐变换其他方式来实现

背景渐变

如果你做过这方面的需求,会发现网上有这段代码来实现背景的切换

1
2
3
4
WindowManager.LayoutParams lp = ((Activity) mPopView.getContext()).getWindow().getAttributes();
lp.alpha = 1f;
((Activity) mPopView.getContext()).getWindow().setAttributes(lp);
((Activity) mPopView.getContext()).getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

实际操作了后发现背景是变暗了,但是是瞬间变化,这太low了,我们要的是渐变。可以用ValueAnimator对其做个动画,这样就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void backgroundAlpha(float startAlpha, float endAlpha, long duration) {
final WindowManager.LayoutParams lp = ((Activity) mPopView.getContext()).getWindow().getAttributes();
ValueAnimator valueAnimator = ValueAnimator.ofFloat(startAlpha, endAlpha);
valueAnimator.setDuration(duration);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentAlpha = (float) animation.getAnimatedValue();
lp.alpha = currentAlpha;
((Activity) mPopView.getContext()).getWindow().setAttributes(lp);
((Activity) mPopView.getContext()).getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}
});
valueAnimator.start();
}

实际运行后,完美解决

转载请指明出处RobinBlog:http://robinx.net/2016/12/05/略坑的PopupWindow/