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

Android PopupWindow弹窗动态显示在View的上下方,

序、周末不加班,

效果图如下。

我们要弹出的PopupWindow在View的下方,如果下方区域不够,则弹出在上方。

实现方案思路

我们在显示的时候,首先去计算一下弹窗高度。使用屏幕的高 - popupwind的高并且和popup的高做对比,如果大于的话,则显示在下方,如果小于的话,则显示在上方。

 /**** @param anchorView 锚点View* @param contentView 弹出的View* @return*/private int[] calculatePopWindowPos(final View anchorView, final View contentView) {final int[] windowPos = new int[2];final int[] anchorLoc = new int[2];// 获取锚点View在屏幕上的左上角坐标位置anchorView.getLocationOnScreen(anchorLoc);final int anchorHeight = anchorView.getHeight();// 获取屏幕的高宽final int screenHeight = getScreenHeight(anchorView.getContext());final int screenWidth = getScreenWidth(anchorView.getContext());contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);// 计算contentView的高宽final int windowHeight = contentView.getMeasuredHeight();final int windowWidth = contentView.getMeasuredWidth();// 判断需要向上弹出还是向下弹出显示final boolean isNeedShowUp = (screenHeight - anchorLoc[1] - anchorHeight < windowHeight);Log.i("AAAA", "screenWidth = "+screenWidth+"---"+"windowWidth="+windowWidth);if (isNeedShowUp) {windowPos[0] = (screenWidth - windowWidth)/2;windowPos[1] = anchorLoc[1] - windowHeight;} else {windowPos[0] = (screenWidth - windowWidth)/2;windowPos[1] = anchorLoc[1] + anchorHeight;}return windowPos;}

显示popupwindow如下

 Button btn1 = findViewById(R.id.btn1);btn1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {View contentView = LayoutInflater.from(ListActivity.this).inflate(R.layout.layout_window, null);PopupWindow popupWindow = new PopupWindow(contentView,ViewGroup.LayoutParams.WRAP_CONTENT , ViewGroup.LayoutParams.WRAP_CONTENT);// 设置PopupWindow可以获得焦点,否则无法响应点击事件popupWindow.setFocusable(true);
//                popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));int[] windowPos = calculatePopWindowPos(view, contentView);// 3. 显示PopupWindowpopupWindow.showAtLocation(view,Gravity.TOP|Gravity.START, windowPos[0], windowPos[1]);}});

完毕。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Bigtop 从0开始(上)
  • 从匿名内部类到Lambda表达式:Java编程的优雅进化
  • Challenge——spfa
  • 文件IO和多路复用IO
  • Flink入门(五)--Flink算子
  • 【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第六篇 嵌入式GUI开发篇-第八十三章 Qt基础
  • Windows系统电脑安装多个Tomcat服务教程
  • 2021年高教社杯国赛a题 详细代码 文章 教学 2024数学建模国赛数模备赛: “FAST”主动反射面的形状调节
  • Android 自适应屏幕技术
  • SpringBootWeb 篇-深入了解 SpringBoot + Vue 的前后端分离项目部署上线与 Nginx 配置文件结构
  • HTML简单了解和基础知识记录
  • 高可用IP地址管理:使用Keepalived和Nginx实现VIP及IP池配置
  • kaggle竞赛宝典 | 量化竞赛第一名的网络模型
  • 【系统架构设计师】论文:论软件开发平台的选择与应用
  • NPJ系列|放射组学与多组学数据整合:推进精准肿瘤学的新模式|文献速递·24-08-25
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Angular2开发踩坑系列-生产环境编译
  • javascript面向对象之创建对象
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Making An Indicator With Pure CSS
  • mysql常用命令汇总
  • ng6--错误信息小结(持续更新)
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • ubuntu 下nginx安装 并支持https协议
  • Vue 2.3、2.4 知识点小结
  • vue中实现单选
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 欢迎参加第二届中国游戏开发者大会
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 面试遇到的一些题
  • 目录与文件属性:编写ls
  • 前端学习笔记之观察者模式
  • 详解移动APP与web APP的区别
  • 延迟脚本的方式
  • 运行时添加log4j2的appender
  • 在Unity中实现一个简单的消息管理器
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​如何在iOS手机上查看应用日志
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #预处理和函数的对比以及条件编译
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (a /b)*c的值
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (篇九)MySQL常用内置函数
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (一)为什么要选择C++
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 动态调用WebService + WSE + UsernameToken