当前位置: 首页 > news >正文

教你如何封装一个通用的PopupWindow

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

先上效果图:

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

PopupWindow 这个类用来实现一个弹出框,可以使用任意布局的 View 作为其内容,这个弹出框是悬浮在当前 activity 之上的。

一般 PopupWindow 的使用:

上面就是 PopupWindow 通常需要设置的各个方法,不难,但是稍微有点繁琐,有些是可以复用的,所以封装了一个通用的 CommonPopupWindow:

CommonPopupWindow 继承自 PopupWindow,拥有 PopupWindow 的各个属性方法,使用类似建造者模式,和 AlertDialog 的使用方式差不多,CommonPopupWindow 使用举例:

  • CommonPopupWindow 设置背景

这里使用的是 WindowManager.LayoutParams.alpha 属性,看下官网解释:An alpha value to apply to this entire window. An alpha of 1.0 means fully opaque and 0.0 means fully transparent .

alpha 值适用于整个 Window,α 为 1.0 时表示完全不透明而0.0表示完全透明,默认是1.0,当 PopupWindow 弹出时通过设置 alpha 在(0.0,1.0)之间设置灰色背景,当 PopupWindow 消失时恢复默认值。

  • 计算 CommonPopupWindow 宽高

注:在测量宽高时遇到一种情况,如图所示:

如果设置 TextView 的 android:layout_width="wrap_content",那么测量不出 TextView 准确的 height,当设置 width 为某个确定值时,也能得到准确的 height 了。

  • CommonPopupWindow 设置动画

如设置向右动画:

.setAnimationStyle(R.style.AnimHorizontal);

在 style.xml 文件中设置:

android:windowEnterAnimation、android:windowExitAnimation 分别为 Popupwindow 弹出和消失动画

进入动画为anim目录下的 push_scale_left_in.xml

消失动画为 push_scale_left_out.xml

  • CommonPopupWindow 弹出

因为 CommonPopupWindow 继承自 PopupWindow,所以可以直接使用 PopupWindow 中的弹出方法,常用的下面三种:

其中,showAsDropDown 是显示在参照物anchor的周围,xoff、yoff 分别是X轴、Y轴的偏移量,如果不设置 xoff、yoff,默认是显示在 anchor 的下方;showAtLocation 是设置在父控件的位置,如设置 Gravity.BOTTOM 表示在父控件底部弹出,xoff、yoff 也是X轴、Y轴的偏移量。

如上面向右弹出例子,分别使用 showAsDropDown 和 showAtLocation 来实现:

showAsDropDown:

popupWindow.showAsDropDown(view, view.getWidth(), -view.getHeight());

showAsDropDown 默认展示在 button 的下面,通过改变 X轴 和 Y轴 的偏移量(X轴向右偏移 button 的宽度,Y轴向上偏移 button 的高度),实现在 Button 右边弹出。

showAtLocation:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

使用了 View 的 getLocationOnScreen方法 来获得View在屏幕中的坐标位置,传入的参数必须是一个有2个整数的数组,分别代表 View 的X、Y坐标,即是 View 的左上角的坐标,这里的 View 是 Button,知道了 Button 左上角的坐标,就可以得到要展示的 PopupWindow 的左上角的坐标为 (positions[0] + view.getWidth(), positions[1]),从而实现在 Button 右边弹出。

项目地址:

https://github.com/crazyqiang/AndroidStudy/tree/master/app/src/main/java/org/ninetripods/mq/study/popup

转载于:https://my.oschina.net/JiangTun/blog/968039

相关文章:

  • **python多态
  • URAL 1614. National Project “Trams” (图论大YY)
  • glibc中malloc的详细解释_转
  • [笔记] php常见简单功能及函数
  • SQLServer 理解copyonly备份操作
  • pycharm2016序列号失效问题解决办法
  • ASP.NET Core DI 手动获取注入对象
  • 深入浅出 spring-data-elasticsearch - 基本案例详解(三)
  • 远程桌面无法复制粘贴的解决方法
  • 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.1 CPU基础设施基准...
  • “智能云”战略新品震撼发布,开发者如何快速上手?
  • 对于startActivity的使用改进
  • [设计模式][c++]状态切换模式
  • POJ2117-Electricity
  • HTML/CSS 知识点
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [译] React v16.8: 含有Hooks的版本
  • AWS实战 - 利用IAM对S3做访问控制
  • HTTP 简介
  • IOS评论框不贴底(ios12新bug)
  • Js基础——数据类型之Null和Undefined
  • js中forEach回调同异步问题
  • Linux后台研发超实用命令总结
  • maya建模与骨骼动画快速实现人工鱼
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vue数据传递--我有特殊的实现技巧
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 聚类分析——Kmeans
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 日剧·日综资源集合(建议收藏)
  • 如何设计一个比特币钱包服务
  • 探索 JS 中的模块化
  • 系统认识JavaScript正则表达式
  • 学习JavaScript数据结构与算法 — 树
  • 一些关于Rust在2019年的思考
  • No resource identifier found for attribute,RxJava之zip操作符
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 昨天1024程序员节,我故意写了个死循环~
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​用户画像从0到100的构建思路
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • %check_box% in rails :coditions={:has_many , :through}
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)Linux——Linux常用指令
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (三分钟)速览传统边缘检测算子