Android中的弹窗效果有很多种实现形式,今天讲一下PopupWindow。
// 加载布局文件,即弹窗的布局
View view = getLayoutInflater().inflate(R.layout.popou_window, null);
//创建弹窗对象
PopupWindow mPopupWindow = new PopupWindow(view, width, heigh,boolean);
四个参数分别是:布局文件填充的view,弹窗的宽,弹窗的高,是否获取焦点,通常为true
//配置一些弹窗信息
//mPopupWindow.setBackgroundDrawable(new BitmapDrawable());//这个过时了
//用下面的设置背景主要作用就是能够在返回键和点击其他区域时候能够隐藏PopupWindow
ColorDrawable colorDrawable = new ColorDrawable(Color.TRANSPARENT);
mPopupWindow.setBackgroundDrawable(colorDrawable);
//设置可点击
mPopupWindow.setTouchable(true);
// 设置点击空白区域取消PopupWindow,还要必须设置透明的背景才会生效
mPopupWindow.setOutsideTouchable(true);
setBackgroundDrawable(new ColorDrawable(0x00000000));
最后就是show。show的方式有两种:
showAsDropDown(mPopupWindow)//从底部弹出
popupWindow.showAtLocation(view, Gravity.LEFT ,x, y);//从指定位置弹出
四个参数分别是:基准的控件(屏幕上任意一个控件都行),弹出的位置,横坐标偏移量,纵坐标偏移量,通常为0
popupWindow.setAnimationStyle(R.style.PopupWindowAnimation);//还可以设置弹窗动画
取消显示就是mPopupWindow.dismiss();
自定义popupwindow
View vInflate = View.inflate(this, R.layout.item, null); //得到我们要的布局
//vPopupWindow 的宽高有两种设置的方法
方法一:
PopupWindow vPopupWindow = new PopupWindow(
vInflate,
WindowManager.LayoutParams.MATCH_PARENT, //宽度
WindowManager.LayoutParams.WRAP_CONTENT//高度
);
方法二:
PopupWindow vPopupWindow = new PopupWindow(vInflate,
getWindow().getDecorView().getWidth(),
getWindow().getDecorView().getHeight()/2);
//同时设置这两个点击空白处才能消失
vPopupWindow.setOutsideTouchable(true);
vPopupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));
//这里的mViewById可以是屏幕上的任意一个view就行了,并不是说要是parentview
//Gravity.BOTTOM是弹出位置,0,0是xy轴上的偏移量
vPopupWindow.showAtLocation(mViewById, Gravity.BOTTOM,0,0);
// 有人说设置popWindow弹出窗体可点击,这句话必须添加,并且是true,但是不加好像也行,注意一下
window.setFocusable(true);
为弹窗设置动画
//在res/anim下创建动画
//在style下创建动画样式
<style name="yzy" parent="android:Animation"> //这个parent有点诡异,所以最好加上,不然有时没有动画效果
<item name="android:windowEnterAnimation">@anim/enter_anim</item>
<item name="android:windowExitAnimation">@anim/exit_anim</item>
</style>
//设置动画样式
popupWindow.setAnimationStyle(R.style.yzy);
如果遇到虚拟按键遮挡的情况
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int winHeight = getWindow().getDecorView().getHeight();
mPopupWindow.setOutsideTouchable(false);
mPopupWindow.setBackgroundDrawable(new ColorDrawable(0xffffffff));
mPopupWindow.showAtLocation(getNavigation(), Gravity.BOTTOM, 0, winHeight-rect.bottom);