1.什么是popupWindow?
popupWindow是一个悬浮在当前activity的一个窗口,可以用于展示各种View.利用popupWindow我们可以去实现类似menu,spinner,dialog的效果.(需要注意的是:当我们在一个popupWindow上试图再弹出一个popupWindow时会报一个父控件没有找到的错误)
2.popupWindow和dialog有很多相似之处,他们具体的区别又是什么呢?
popupWindow和dialog最大的区别就是dialog是非阻塞的,popupWindow是阻塞的.
3.如何创建一个popupWindow呢?
我们可以通过popupWindow的构造方法PopupWindow(View contentView, int width, int height, boolean focusable)来创建一个popupWindow的实例,contentView是popupWindow要显示的view,width是popupWindow的宽度,height是popupWindow的高度,focusable是popupWindow能否获得焦点.参考代码如下:
final PopupWindow popupWindow = new PopupWindow(contentView,width, height, true);
//设置popupWindow可点击
popupWindow.setTouchable(true);
// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
4.如何将创建的popupWindow展示出来呢?
系统为我们提供了两个方法让我们展示popupWindow,分别是showAsDropDown()和showAtLocation()这两个方法,下面我们分别看一下这两个方法:
showAsDropDown(View anchor, int xoff, int yoff, int gravity)这个方法是我们指定一个anchorView作为锚点,然后设置popupWindow相对于锚点的x和y的缩进值,gravity是指popupWindow的显示方式是居中或者其他.(在三星的设备中这个方法可能会出现错误,影响程序运行)
showAtLocation(View parent, int gravity, int x, int y)这个方法是我们传入popupWindow的父窗口,gravity是指popupWindow的显示方式是居中或者其他,然后设置popupWindow在父窗口中的x值和y值.
介绍完了两个展示popupWindow的方法,因为第一个方法不能兼容全部设备,所以我们倾向于使用第二个方法,但是使用第二个方法我们会遇到一个问题,假如我们想实现一个这样的功能,点击一个按钮然后在这个按钮的下方显示我们的popupWindow,我们如何确定popupWindow在当前窗口的绝对位置呢?这时我们需要一个getLocationInWindow()的方法来获取我们按钮在当前窗口的绝对位置.getLocationInWindow有一个十分相似的方法叫getLocationInScreen,顾名思义,一个是获取相对于当前窗口的绝对位置,一个是获取相对于屏幕的绝对位置.getLocationInWindow()会将得到的值赋给一个长度为2的数组,第一个位置代表x值,第二个位置代表y值.
5.如何设置popupWindow进入和退出的动画呢?
我们可以使用popupWindow的setAnimationStyle(int animationStyle)方法来为popupWindow来设置相应的进入和退出动画.首先我们要创建两个动画文件加入这两个文件分别是@anim/popuwinoew_alpha_alpha和@anim/exit_popuwinoew_alpha_alpha,接下来我们在Style文件中声明
<style name="popwin_anim_style">
<item name="android:windowEnterAnimation">@anim/popuwinoew_alpha_alpha</item>
<item name="android:windowExitAnimation">@anim/exit_popuwinoew_alpha_alpha</item>
</style>
之后我们就可以调用popupWindow.setAnimationStyle(R.style.popwin_anim_style)来为popupWindow设置动画效果.