henry_popupWindow
### henry_popupWindow知识点解析 #### 一、PopupWindow简介 `PopupWindow`是Android系统提供的一个用于创建弹出窗口的类。它主要用于在应用程序中显示一个非模态的浮动窗口,可以用来实现如菜单、提示框等功能。与`AlertDialog`不同的是,`PopupWindow`更为灵活,可以自定义布局并且不会阻塞屏幕背景的操作。 #### 二、PopupWindow的基本使用方法 1. **创建PopupWindow对象** - 使用`LayoutInflater`来加载自定义布局。 - 创建`PopupWindow`对象时传入加载好的视图,并设置宽度和高度。 ```java LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); View menuView = (View) mLayoutInflater.inflate(R.layout.alert_dialog_menu_layout_new, null, true); PopupWindow popupWindow = new PopupWindow(menuView, LayoutParams.FILL_PARENT, 238, true); ``` 2. **设置PopupWindow属性** - **设置背景**:使用`setBackgroundDrawable()`方法为`PopupWindow`设置背景。可以是颜色也可以是图片资源。 ```java popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.btn_style_alert_dialog_background)); ``` - **设置动画效果**:通过`setAnimationStyle()`方法设置弹出窗口的动画样式。 ```java popupWindow.setAnimationStyle(R.style.PopupAnimation); ``` - **设置触摸交互**:通过`setFocusable()`、`setTouchable()`和`setOutsideTouchable()`等方法设置触摸交互行为。 ```java popupWindow.setFocusable(true); popupWindow.setTouchable(true); popupWindow.setOutsideTouchable(true); ``` 3. **显示PopupWindow** - 使用`showAsDropDown()`方法相对于某个View显示`PopupWindow`。 ```java popupWindow.showAsDropDown(v, 0, 0); ``` - 使用`showAtLocation()`方法相对于屏幕或特定View的位置显示`PopupWindow`。 ```java popupWindow.showAtLocation(findViewById(R.id.parent), Gravity.BOTTOM, 0, 0); ``` 4. **更新PopupWindow** - 如果需要改变`PopupWindow`的尺寸或其他属性,可以调用`update()`方法。 ```java popupWindow.update(); ``` 5. **监听PopupWindow消失事件** - 可以通过设置`OnDismissListener`来监听`PopupWindow`消失的事件。 ```java popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { // 处理消失后的逻辑 } }); ``` #### 三、PopupWindow的动画效果设置 - 在`res/values/styles.xml`文件中定义动画样式: ```xml <style name="PopupAnimation" parent="android:Animation"> <item name="android:windowEnterAnimation">@anim/menu_up</item> </style> ``` - 在`res/anim/`目录下创建动画文件`menu_up.xml`: ```xml <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="500" android:fromXDelta="0.0" android:toXDelta="0.0" android:fromYDelta="100%" android:toYDelta="50%" /> </set> ``` #### 四、PopupWindow的显示位置调整 - 使用`showAsDropDown()`方法时,可以通过第二个和第三个参数来设置相对于参考View的位置偏移量。 - 使用`showAtLocation()`方法时,可以通过第三个参数设置相对于屏幕或特定View的位置,并且可以使用`Gravity`类中的常量来指定对齐方式。 #### 五、PopupWindow的其他注意事项 - 当设置`PopupWindow`为不可聚焦时(`setFocusable(false)`),点击外部区域无法关闭`PopupWindow`,需要手动处理。 - `PopupWindow`在不同版本的Android系统中可能会有兼容性问题,需要注意适配。 通过以上详细解析,我们可以看到`PopupWindow`提供了丰富的功能来满足各种弹出窗口的需求。合理利用这些特性,可以帮助开发者更好地提升应用的用户体验。
// 获取屏幕和对话框各自高宽
dialgoWidth = popupWindow.getWidth();
dialgoheight = popupWindow.getHeight();
popupWindow.setBackgroundDrawable(new ColorDrawable(0));// 点击窗口外消失
popupWindow.showAsDropDown(v, 0, 0);// 设置显示PopupWindow的位置位于View的左下方,x,y表示坐标偏移量
popupWindow.setFocusable(true);
popupWindow.setTouchable(true);
popupWindow.setOutsideTouchable(true);// 点击窗口外消失,需要设置背景、焦点、touchable、update
popupWindow.update();
mPop.setOutsideTouchable(true);//这里设置显示PopuWindow之后在外面点击是否有效。如果为false的话,那么点击PopuWindow外面并不会关闭PopuWindow。当然这里很明显只能在Touchable下才能使用。
当有mPop.setFocusable(false);的时候,说明PopuWindow不能获得焦点,即使设置设置了背景不为空也不能点击外面消失,只能由dismiss()消失,但是外面的View的事件还是可以触发,back键也可以顺利dismiss掉。当设置为popuWindow.setFocusable(true);的时候,加上下面两行设置背景代码,点击外面和Back键才会消失。
mPop.setFocusable(true);
需要顺利让PopUpWindow dimiss(即点击PopuWindow之外的地方此或者back键PopuWindow会消失);PopUpWindow的背景不能为空。必须在popuWindow.showAsDropDown(v);或者其它的显示PopuWindow方法之前设置它的背景不为空:
mPop.showAsDropDown(anchor, 0, 0);//设置显示PopupWindow的位置位于View的左下方,x,y表示坐标偏移量
mPop.showAtLocation(findViewById(R.id.parent), Gravity.LEFT, 0, -90);(以某个View为参考),表示弹出窗口以parent组件为参考,位于左侧,偏移-90。
mPop.setOnDismissListenerd(new PopupWindow.OnDismissListener(){})//设置窗口消失事件
为PopupWindow设置弹出动画效果
- wangzhijun56292014-01-02可以运行 但是不是我想要的……
- ygh0000000012013-09-27这个资源不不错,非常适合下载!
- 粉丝: 0
- 资源: 25
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助