1.构造函数
//方法一:
public PopupWindow (Context context)
//方法二:
public PopupWindow(View contentView)
//方法三:
public PopupWindow(View contentView, int width, int height)
//方法四:
public PopupWindow(View contentView, int width, int height, boolean focusable)
方法三和方法四常用
2.显示函数
//相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor):
//相对某个控件的位置,有偏移;xoff表示x轴的偏移,正值表示向左,负值表示向右;yoff表示相对y轴的偏移,正值是向下,负值是向上;
showAsDropDown(View anchor, int xoff, int yoff):
//相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
showAtLocation(View parent, int gravity, int x, int y):
3.常用函数
1 dismiss() 使popupwindow消失 2 setTouchable(boolean touchable) 设置PopupWindow是否响应touch事件,默认是true,如果设置为false,即会是下面这个结果:(所有touch事件无响应,包括点击事件) 3 setFocusable(boolean focusable) 该函数的意义表示,PopupWindow是否具有获取焦点的能力,默认为False。一般来讲是没有用的,因为普通的控件是不需要获取焦点的,而对于EditText则不同,如果不能获取焦点,那么EditText将是无法编辑的。 4 setOutsideTouchable(boolean touchable) 这个函数的意义,就是指,PopupWindow以外的区域是否可点击,即如果点击PopupWindow以外的区域,PopupWindow是否会消失。 5 setBackgroundDrawable(Drawable background) 1. 设置背景 2. 只有setBackgroudDrawable后,setOutsideTouchable()才能起作用 3. 加上后,手机的返回按钮才有响应
1)设置获取contentview
public void setContentView(View contentView):设置要显示的布局
public View getContentView():获取显示的布局
2)设置宽高
setWidth(LayoutParams.WRAP_CONTENT):设置宽度
setHeight(LayoutParams.WRAP_CONTENT):设置高度
3)设置点击空白处Popupwindow消失
设置点击空白处Popupwindow消失(3个方法都要设置)
setFocusable(true);
setOutsideTouchable(true);//设置背景(选择其中一个)
setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));
setBackgroundDrawable(new BitmapDrawable());
setBackgroundDrawable(new ColorDrawable(0x00000000))
4)添加动画效果
1.在工程res下新建anim文件夹,在anim文件夹先新建两个xml文件
menu_bottombar_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="250"
android:fromYDelta="100.0%"
android:toYDelta="0.0" />
</set>
menu_bottombar_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="250"
android:fromYDelta="0.0"
android:toYDelta="100%" />
</set>
2.在res/value/styles.xml添加一个sytle
<style name="anim_menu_bottombar">
<item name="android:windowEnterAnimation">@anim/menu_bottombar_in</item>
<item name="android:windowExitAnimation">@anim/menu_bottombar_out</item>
</style>
3.setAnimationStyle(R.style.menu_anim_bottombar);
4.其他函数
//返回该popup window出现或消失的动画类型,返回值为整型
int getAnimationStyle()
//返回popup window的背景,返回值为Drawable类型
Drawable getBackground()
//设置该popup window显示的内容
View getContentView()
//返回popup window展示的内容,返回值为一个View
void setContentView(View contentView)
//返回该popup window的高度值,返回值为int型
int getHeight()
//设置该popup window是否获得焦点
void setFocusable(boolean focusable)
//设置输入法的模式,参数为这三个:INPUT_METHOD_FROM_FOCUSABLE(根据是否可以获得焦点决定), INPUT_METHOD_NEEDED(允许输入法), or INPUT_METHOD_NOT_NEEDED(不允许输入法)。
// 当popup window中包含EditText时可能会涉及这方面,可能是出现输入法显示在popup window后面,导致无法输入的问题,可以修改焦点和这里
void setInputMethodMode(int mode)
//返回当前popup window对输入法的设置模式
int getInputMethodMode()
//返回能使当前popup window完整显示的最大高度
int getMaxAvailableHeight(View anchor)
//同上
int getMaxAvailableHeight(View anchor, int yOffset)
//设置输入法的操作模式
void setSoftInputMode(int mode)
//获得输入法的操作模式
int getSoftInputMode()
int getWidth()
void setHeight(int height)
//判断popup window是否超出了父View的布局之外
boolean isAboveAnchor()
//判断当前popup window是否获得焦点
boolean isFocusable()
//判断当前pw的外界触碰是否有响应
boolean isOutsideTouchable()
//判断当前popup window是否处于显示状态
boolean isShowing()
//判断当前pw是否支持多点触碰
boolean isSplitTouchEnabled()
//判断当前pw是否接受触摸事件
boolean isTouchable()
//设置popup window的动画样式,有什么样式去Animation
void setAnimationStyle(int animationStyle)
//设置pw背景
void setBackgroundDrawable(Drawable background)
/*允许弹出窗口超出屏幕范围。默认情况下,窗口被夹到屏幕边界。设置为false将允许Windows精确定位。也就是说,如果这个Popupwindow显示区域 不足或者层叠将导致绘制位置计算不准确,需要手动设置为false */
boolean isClippingEnabled()
void setClippingEnabled(boolean enabled)
//这个以前我也没见过,还蛮好玩。设置是否忽略“脸颊触碰”,默认为false,即不忽略。什么是“脸颊触碰”? Events都有一个大小,当Events的大小比手指尺寸大时即为CheekPress,这个可能常用于打电话时脸颊碰到屏幕的情况*/
void setIgnoreCheekPress()
//popup window消失时的回调方法
void setOnDismissListener(PopupWindow.OnDismissListener onDismissListener)
/*控制popup window以外的区域被点击后是否有影响,一般与setTouchInterceptor配合使用*/
void setOutsideTouchable(boolean touchable)
//是否允许分开、多点触控,一般很少用,不容易控制
void setSplitTouchEnabled(boolean enabled)
/*当popup window被触碰时的回调方法*/
void setTouchInterceptor(View.OnTouchListener l)
//设置popup window是否可触碰
void setTouchable(boolean touchable)
/*修改popup window的宽度,如果已经显示了popup window,修改后不会立即更新。只有下次出现或者调用update()方法才会更新*/
void setWidth(int width)
//改变popup管理的window的尺寸
void setWindowLayoutMode(int widthSpec, int heightSpec)
/*都是更新popup window的尺寸和位置,取决于你是在参数里进行改变,还是调用setWidth等方法改变后再更新*/
void update(int width, int height)
void update(View anchor, int width, int height)
void update(int x, int y, int width, int height)
void update(View anchor, int xoff, int yoff, int width, int height)
void update()
void update(int x, int y, int width, int height, boolean force)
5.代码体现
private void showPopudown(View view) {
LayoutInflater inflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View contentview=inflater.inflate(R.layout.popu_image,null);
ImageView img=contentview.findViewById(R.id.img);
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"图片被点击及了",Toast.LENGTH_SHORT).show();
}
});
popupWindow=new PopupWindow(contentview);
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setFocusable(true);
// popupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));
popupWindow.setBackgroundDrawable(new BitmapDrawable());
popupWindow.setOutsideTouchable(true);
popupWindow.setAnimationStyle(R.style.anim_popup);
popupWindow.showAsDropDown(view,0,0);
// popupWindow.showAtLocation(findViewById(R.id.rl1), Gravity.BOTTOM,0,0);
}
参考:
1. https://blog.csdn.net/u011240877/article/details/46058349
2.