4-VIV-Android之PopupWindow
PopWindow是一个可以在Activity 之上显示任意View的控件。
PopWindow可自定义进出动画、显示位置,根据已有视图对齐显示,可谓弹框一哥。
实例:在按钮上面显示
一、创建及配置
加载视图-->创建对象-->初始设置
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.更多关于我
笔名 | 微信 | 爱好 | |
---|---|---|---|
张风捷特烈 | 1981462002 | zdl1994328 | 语言 |
我的github | 我的简书 | 我的CSDN | 个人网站 |
3.声明
1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4----看到这里,我在此感谢你的喜欢与支持
4-VIV-Android之PopupWindow相关推荐
- Android下PopupWindow隐藏及显示(showAtLocation/showAsDropDown)
转载:http://orgcent.com/android-popupwindow-showasdropdown-showatlocation/ 上一篇对PopupWindow的用法(位置.动画.焦点 ...
- android 设置PopupWindow的显示大小
今天,简单讲讲android 如何设置弹出的PopupWindow的大小. 之前,我做了一个PopupWindow,里面是一个ExpandableListView,设置PopupWindow的大小为: ...
- android 设置PopupWindow透明度
今天,简单讲讲android里如何设置PopupWindow的透明度. 之前,我看到其他app的记住用户名的PopupWindow是透明的,可是自己做的记住用户名的PopupWindow却不是透明的, ...
- Android之Activity **** has leaked window android.widget.PopupWindow$PopupDecorView that was originall
1 问题 在页面实现了popupWindows,旋转屏幕的时候提示下面的错误 Activity **** has leaked window android.widget.PopupWindow$Po ...
- Android之PopupWindow弹出对话框
Android的对话框常用的有两种:PopupWindow和AlertDialog. popupWindow是一个阻塞式的弹出框,这就意味着在我们退出这个弹出框之前,程序会一直等待,,这就意味着在我们 ...
- android 自定义popupwindow,自定义通过PopupWindow实现通用菜单
会经常用户到菜单选项提供给用户选择,例如选择图片,图库和相机选择等一系列场景吧,根据为了以后更加方便使用通过自定义封装了一个菜单,主要是通过一个列表展示,将菜单项列表传入设置参数就可以显示,使用方便简 ...
- android 自定义popupwindow样式,自定义popupwindow组件
先看效果...... 现在很多的应用效果都需要做的炫些,像UC,以及天天静听,效果很炫的,源码已经对外开放了,有兴趣的可以去研究下的 上源码 main.xml android:layout_width ...
- Android用PopupWindow实现新浪微博的分组信息
在上一篇文章(http://blog.csdn.net/jiahui524/article/details/7269738)中我曾经用重写Dialog的方法来实现过对于分组信息的一些实现.后来在我的文 ...
- android 自定义 popupwindow,Android自定义弹出窗口PopupWindow使用技巧
PopupWindow是Android上自定义弹出窗口,使用起来很方便. PopupWindow的构造函数为 public PopupWindow(View contentView, int widt ...
- android弹窗闪退,[Android 小记] PopupWindow中放置Spinner 点击直接闪退的问题分析
错误原因:android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRo ...
最新文章
- 走近TCP/IP协议
- Centos6.3下利用rsyslog+loganalyzer+mysql部署日志服务器
- jQuery遍历之next()、nextAll()方法使用实例
- Hadoop源代码分析(四)
- c++枚举类型(一)
- 【python图像处理】txt文件数据的读取与写入
- cenotos 卸载mysql_CentOS 6.2编译安装Nginx1.0.12+MySQL5.5.21+PHP5.3.10 | 系统运维
- Vim-复制选中内容至系统剪贴板,光标移动到指定行的行首和行尾
- nginx添加ssl证书认证
- 20155220 2016-2017-2 《java程序设计》第二周学习总结
- linux系统配置脚本,Linux系统配置脚本开机自启
- 使用linux内核编译独立系统,编译linux内核以及depmod的使用
- 【转】string.Format对C#字符串格式化
- Digital Filters
- Word转pdf文件使用技巧:怎么安装虚拟pdf打印机
- centos修改用户密码图形化
- Android/IOS高仿微信IM源码
- ajax的Provisional headers are shown
- 试题 基础练习 Fibonacci数列
- 漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
热门文章
- 深入浅出使用python编程_深入浅出Python元编程
- 系统分析与设计个人总结
- 【报错笔记】Windows下spacy en_core_web_sm安装解决方式
- 【零知ESP8266教程】快速入门10-使用PWM进行调光
- 整合经营模式之道(序)——暨“一路一起舞吧”开博之作
- 数据丢包怎么修复_一种网络传输中实时音频数据丢包恢复的方法与流程
- 60行代码爬取知乎神回复
- self_drive car_学习笔记--第8课:定位算法
- ext4 文件系统的特点、优缺点以及使用场景
- 数据使用要谨慎——不良数据带来严重后果