我突然感觉不应该说那么多,直接上代码和解释就好了,毕竟根据需求搜索的,说那么多废话也没啥用处。
popwindow不想dialog那样,弹出之后背景就会变暗,他的背景是不会变得,所以需要我们手动的去使他变暗。我们可以修改WindowManager的参数来是背景变暗,但是修改之后toolBar也会变暗,有些时间我们不希望toolBar变暗,就不能修改参数,我们可以通过添加一个View来来覆盖界面达到变暗的效果。
首先写一下修改WindowManager的参数来达到变暗的效果
// 设置背景颜色变暗
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 0.7f;
getWindow().setAttributes(lp);
然后我们可以监听popWindow来取消变暗
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 1f;
getWindow().setAttributes(lp);
}
});
以上是通过代码来达到变暗的效果。下面就讲一下使用View覆盖来达到效果。
这个是覆盖的View
<View
android:id="@+id/gray_layout"
android:layout_below="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#66000000"
android:visibility="gone" />
//对黑色半透明背景做监听,点击时开始退出动画并将popupwindow dismiss掉
mGrayLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPopWindowShowing) {
mPopupWindow.getContentView().startAnimation(AnimationUtil.createOutAnimation(MainActivity.this, fromYDelta));
mPopupWindow.getContentView().postDelayed(new Runnable() {
@Override
public void run() {
mPopupWindow.dismiss();
}
}, AnimationUtil.ANIMATION_OUT_TIME);
}
}
});
下面是在你调用popWindow的地方的代码
if (isPopWindowShowing) {
mPopupWindow.getContentView().startAnimation(AnimationUtil.createOutAnimation(MainActivity.this, fromYDelta));
mPopupWindow.getContentView().postDelayed(new Runnable() {
@Override
public void run() {
mPopupWindow.dismiss();
}
}, AnimationUtil.ANIMATION_OUT_TIME);
} else {
showPopupWindow();
}
显示popWindow的方法
private void showPopupWindow() {
final View contentView = LayoutInflater.from(this).inflate(R.layout.selsectlist, null);
TextView t1 = (TextView) contentView.findViewById(R.id.text1);
mPopupWindow = new PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
//将这两个属性设置为false,使点击popupwindow外面其他地方不会消失
mPopupWindow.setOutsideTouchable(false);
mPopupWindow.setFocusable(false);
mGrayLayout.setVisibility(View.VISIBLE);
//获取popupwindow高度确定动画开始位置
int contentHeight = ViewUtils.getViewMeasuredHeight(contentView);
// int contentHeight = contentView.getHeight();
Log.i(TAG, "contentview height=" + contentHeight);
fromYDelta = -contentHeight;
Log.i(TAG, "fromYDelta=" + fromYDelta);
mPopupWindow.showAsDropDown(toolbar, 0, 0);
mPopupWindow.getContentView().startAnimation(AnimationUtil.createInAnimation(this, fromYDelta));
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
isPopWindowShowing = false;
mGrayLayout.setVisibility(View.GONE);
}
});
isPopWindowShowing = true;
}
给PopWindow添加动画:
public class AnimationUtil {
//动画持续时间
public final static int ANIMATION_IN_TIME=500;
public final static int ANIMATION_OUT_TIME=500;
public static Animation createInAnimation(Context context,int fromYDelta){
AnimationSet set=new AnimationSet(context,null);
set.setFillAfter(true);
TranslateAnimation animation=new TranslateAnimation(0,0,fromYDelta,0);
animation.setDuration(ANIMATION_IN_TIME);
set.addAnimation(animation);
AlphaAnimation alphaAnimation=new AlphaAnimation(0,1);
alphaAnimation.setDuration(ANIMATION_IN_TIME);
set.addAnimation(alphaAnimation);
return set;
}
public static Animation createOutAnimation(Context context, int toYDelta){
AnimationSet set=new AnimationSet(context,null);
set.setFillAfter(true);
TranslateAnimation animation=new TranslateAnimation(0,0,0,toYDelta);
animation.setDuration(ANIMATION_OUT_TIME);
set.addAnimation(animation);
AlphaAnimation alphaAnimation=new AlphaAnimation(1,0);
alphaAnimation.setDuration(ANIMATION_OUT_TIME);
set.addAnimation(alphaAnimation);
return set;
}
}
测量PopWindow的宽高
public class ViewUtils {
/**
* 获取控件的高度
*/
public static int getViewMeasuredHeight(View view) {
calculateViewMeasure(view);
return view.getMeasuredHeight();
}
/**
* 获取控件的宽度
*/
public static int getViewMeasuredWidth(View view) {
calculateViewMeasure(view);
return view.getMeasuredWidth();
}
/**
* 测量控件的尺寸
*/
private static void calculateViewMeasure(View view) {
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(w, h);
}
}