PopWindow是一个可以在Activity 之上显示任意View的控件。
PopWindow可自定义进出动画、显示位置,根据已有视图对齐显示,可谓弹框一哥。

实例:在按钮上面显示
pop.gif

一、创建及配置

加载视图-->创建对象-->初始设置

1.代码
//1.加载视图
View popView = LayoutInflater.from(this).inflate(R.layout.pop_show, null);//2.创建对象
mPopupWindow = new PopupWindow();
//3.初始设置
mPopupWindow.setContentView(popView);//设置视图
mPopupWindow.setWidth(300);//设置宽
mPopupWindow.setHeight(500);//设置高
//        //等价于上面四句
//        mPopupWindow = new PopupWindow(popView,
//                LinearLayout.LayoutParams.MATCH_PARENT,
//                LinearLayout.LayoutParams.MATCH_PARENT);
mPopupWindow.setFocusable(true);//可聚焦--默认true
mPopupWindow.setTouchable(true);//可触碰--默认true
mPopupWindow.setOutsideTouchable(true);//点外部消失
//在安卓4.4(API 19)测试需要背景(这里是一个透明色)才能点外部消失,安卓8.1(API 27)则不需要
mPopupWindow.setBackgroundDrawable(ContextCompat.getDrawable(this, R.color.transparent));
//4.设置动画样式:
mPopupWindow.setAnimationStyle(R.style.slide_anim);//设置mPopWindow进出动画

2.动画样式:

默认动画是忽然出现,忽然消失的

values/styles.xml
<style name="slide_anim"><item name="android:windowEnterAnimation">@anim/slide_up</item><item name="android:windowExitAnimation">@anim/slide_down</item>
</style>
anim/slide_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><!--划下:--><translateandroid:duration="200"android:fromYDelta="0"android:toYDelta="100%"/>
</set>
anim/slide_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" ><!--划上:--><translateandroid:duration="200"android:fromYDelta="100%"android:toYDelta="0" />
</set>

二、显示与隐藏

//显示的适配
CompatShowPop.handle(mPopupWindow, mButton, CompatShowPop.BOTTOM2TOP);
mPopupWindow.dismiss();//消失
/*** 作者:张风捷特烈<br/>* 时间:2018/11/1 0001:10:40<br/>* 邮箱:1981462002@qq.com<br/>* 说明:以View确定popWindow适配*/
public class CompatShowPop {//pop顶对顶public static final int TOP2TOP = 0x01;//pop顶对底public static final int TOP2BOTTOM = 0x02;//pop底对顶public static final int BOTTOM2TOP = 0x03;/*** 以View确定popWindow适配** @param popupWindow popupWindow* @param view        view* @param type        类型*/public static void handle(PopupWindow popupWindow, View view, int type) {//处理PopWindow7.0适配if (Build.VERSION.SDK_INT < 24) {switch (type) {case TOP2TOP:popupWindow.showAsDropDown(view, 0, -view.getHeight());break;case TOP2BOTTOM:popupWindow.showAsDropDown(view, 0, 0);break;case BOTTOM2TOP:
//                    popupWindow.showAsDropDown(view, 0, -view.getHeight() - popupWindow.getHeight());popupWindow.showAtLocation(view, Gravity.CLIP_HORIZONTAL, 0, 0);}} else {int[] location = new int[2];view.getLocationOnScreen(location);int x = location[0];int y = location[1];switch (type) {case TOP2TOP:popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, x, y);break;case TOP2BOTTOM:popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, x, y + view.getHeight());break;case BOTTOM2TOP:
//                    popupWindow.showAtLocation(view, Gravity.CLIP_HORIZONTAL, 0, 0);popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, x, y - popupWindow.getHeight());}}}
}

三、PopupWindow的简单封装

/*** 作者:张风捷特烈<br/>* 时间:2018/11/1 0001:11:42<br/>* 邮箱:1981462002@qq.com<br/>* 说明:PopupWindow的封装*/
public abstract class BasePopWindow extends PopupWindow {private View mRootView;private Context mContext;private SparseArray<View> mViews;public BasePopWindow(Context context) {this(context, -1);}public BasePopWindow(Context context, int animStyleId) {mContext = context;//获取屏幕尺寸WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);mRootView = LayoutInflater.from(context).inflate(layoutId(), null);mViews = new SparseArray<>();//基本设置setContentView(mRootView);setWidth(outMetrics.widthPixels);setHeight(outMetrics.heightPixels);setFocusable(true);setTouchable(true);setOutsideTouchable(true);//沉浸标题栏,全屏显示setClippingEnabled(false);setBackgroundDrawable(new BitmapDrawable());if (animStyleId != -1) {setAnimationStyle(animStyleId);//设置mPopWindow进出动画}}/*** 通过viewId获取控件** @param viewId pop里的控件id* @param <T>    控件视图* @return 控件视图*/public <T extends View> T getView(int viewId) {View view = mViews.get(viewId);if (view == null) {view = mRootView.findViewById(viewId);mViews.put(viewId, view);}return (T) view;}public abstract int layoutId();
}

后记:捷文规范

1.本文成长记录及勘误表
项目源码 日期 备注
V0.1--无 2018-11-1 4-VIV-Android之PopupWindow
2.更多关于我
笔名 QQ 微信 爱好
张风捷特烈 1981462002 zdl1994328 语言
我的github 我的简书 我的CSDN 个人网站
3.声明

1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4----看到这里,我在此感谢你的喜欢与支持

4-VIV-Android之PopupWindow相关推荐

  1. Android下PopupWindow隐藏及显示(showAtLocation/showAsDropDown)

    转载:http://orgcent.com/android-popupwindow-showasdropdown-showatlocation/ 上一篇对PopupWindow的用法(位置.动画.焦点 ...

  2. android 设置PopupWindow的显示大小

    今天,简单讲讲android 如何设置弹出的PopupWindow的大小. 之前,我做了一个PopupWindow,里面是一个ExpandableListView,设置PopupWindow的大小为: ...

  3. android 设置PopupWindow透明度

    今天,简单讲讲android里如何设置PopupWindow的透明度. 之前,我看到其他app的记住用户名的PopupWindow是透明的,可是自己做的记住用户名的PopupWindow却不是透明的, ...

  4. Android之Activity **** has leaked window android.widget.PopupWindow$PopupDecorView that was originall

    1 问题 在页面实现了popupWindows,旋转屏幕的时候提示下面的错误 Activity **** has leaked window android.widget.PopupWindow$Po ...

  5. Android之PopupWindow弹出对话框

    Android的对话框常用的有两种:PopupWindow和AlertDialog. popupWindow是一个阻塞式的弹出框,这就意味着在我们退出这个弹出框之前,程序会一直等待,,这就意味着在我们 ...

  6. android 自定义popupwindow,自定义通过PopupWindow实现通用菜单

    会经常用户到菜单选项提供给用户选择,例如选择图片,图库和相机选择等一系列场景吧,根据为了以后更加方便使用通过自定义封装了一个菜单,主要是通过一个列表展示,将菜单项列表传入设置参数就可以显示,使用方便简 ...

  7. android 自定义popupwindow样式,自定义popupwindow组件

    先看效果...... 现在很多的应用效果都需要做的炫些,像UC,以及天天静听,效果很炫的,源码已经对外开放了,有兴趣的可以去研究下的 上源码 main.xml android:layout_width ...

  8. Android用PopupWindow实现新浪微博的分组信息

    在上一篇文章(http://blog.csdn.net/jiahui524/article/details/7269738)中我曾经用重写Dialog的方法来实现过对于分组信息的一些实现.后来在我的文 ...

  9. android 自定义 popupwindow,Android自定义弹出窗口PopupWindow使用技巧

    PopupWindow是Android上自定义弹出窗口,使用起来很方便. PopupWindow的构造函数为 public PopupWindow(View contentView, int widt ...

  10. android弹窗闪退,[Android 小记] PopupWindow中放置Spinner 点击直接闪退的问题分析

    错误原因:android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRo ...

最新文章

  1. 走近TCP/IP协议
  2. Centos6.3下利用rsyslog+loganalyzer+mysql部署日志服务器
  3. jQuery遍历之next()、nextAll()方法使用实例
  4. Hadoop源代码分析(四)
  5. c++枚举类型(一)
  6. 【python图像处理】txt文件数据的读取与写入
  7. cenotos 卸载mysql_CentOS 6.2编译安装Nginx1.0.12+MySQL5.5.21+PHP5.3.10 | 系统运维
  8. Vim-复制选中内容至系统剪贴板,光标移动到指定行的行首和行尾
  9. nginx添加ssl证书认证
  10. 20155220 2016-2017-2 《java程序设计》第二周学习总结
  11. linux系统配置脚本,Linux系统配置脚本开机自启
  12. 使用linux内核编译独立系统,编译linux内核以及depmod的使用
  13. 【转】string.Format对C#字符串格式化
  14. Digital Filters
  15. Word转pdf文件使用技巧:怎么安装虚拟pdf打印机
  16. centos修改用户密码图形化
  17. Android/IOS高仿微信IM源码
  18. ajax的Provisional headers are shown
  19. 试题 基础练习 Fibonacci数列
  20. 漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了

热门文章

  1. 深入浅出使用python编程_深入浅出Python元编程
  2. 系统分析与设计个人总结
  3. 【报错笔记】Windows下spacy en_core_web_sm安装解决方式
  4. 【零知ESP8266教程】快速入门10-使用PWM进行调光
  5. 整合经营模式之道(序)——暨“一路一起舞吧”开博之作
  6. 数据丢包怎么修复_一种网络传输中实时音频数据丢包恢复的方法与流程
  7. 60行代码爬取知乎神回复
  8. self_drive car_学习笔记--第8课:定位算法
  9. ext4 文件系统的特点、优缺点以及使用场景
  10. 数据使用要谨慎——不良数据带来严重后果