今天来记录一下在Activity中或者在(Dialog or Popupwindow )中点击按钮弹出popupwindow 自使用判断是向下弹出还是向上弹出。

1、Activity中弹出点击按钮弹出popupwindow

1.0:比如:

QQ图片20170316110343.png

这种是要在Activity中的ListView中或者其他布局中展示要弹出的Popupwindow 直接向下即可没什么好阐述的,很简单的代码

m_popupwindow.showAsDropDown(放入View, 0, 0);

1.1:比如在底部点击弹出Popupwindow

QQ图片20170316110356.png

首先要显示弹出Popupwindow 显示个数,如果超出则按照固定大小来进行计算,否则自使用,这种也比较简单

m_popupwindow.showAtLocation(放入View, Gravity.TOP | Gravity.START,

location[0],

location[1] - measuredHeight);

有人会问了 如何计算popupwindow是向下还是向上的呢?

1.1.0

首先需要计算一下弹出这个popupwindow的高度

QQ图片20170316111738.png

有人会问了如果我里面的高度是不固定的呢?放的是ListView呢?别着急,后面会讲到

高度的计算就是popupwindow内View的高度

(popupwindow的View).getMeasuredHeight();

如果popupwindow用的是一个实例的话,那么刚开始new popupwindow的时候拿getMeasuredHeight()这个方法一直都是0,只有第二次才不为0,其中的为什么在此处就不分析了,只需要加入

(popupwindow的View).measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

1.1.1 即可,但是此处还有一个问题,第一次得到的是模板的高度,如果popupwindow内放入的是ListView的话,那么将得到的是一个模板的高度,也就是是仅此一条数据的高度这里面,那么如何得到ListView内数据的真实高度呢?所以这时候要限制里面的高度所以在new popupwindow的时候可以这么写

if(数据.size() > 4){

m_popupwindow = new PopupWindow(m_view,LayoutParams.WRAP_CONTENT, DensityUtil.dip2px(m_context, 200));// LayoutParams.WRAP_CONTENT);

}else{

m_popupwindow = new PopupWindow(m_view, LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

}

所以接下来要获取上述的问题就可以这么做

measuredHeight = m_view.getMeasuredHeight();

measuredHeight = (m_data.length > 4 ? DensityUtil.dip2px(m_context, 200) : (measuredHeight - 1) * m_data.length);

以上算法就仅当PopupWindow是ListView不固定数据 如果是固定数据的话,那么直接

measuredHeight = m_view.getMeasuredHeight();

即可。但是如果将这个做成通用库的话,怎么自动进行判断是向上弹出,还是向下弹出呢?代码如下:

boolean isNeedShowUp = (screenHeight - location[1] - m_Linearlayout.getHeight() < measuredHeight);

if (!isNeedShowUp) {

m_popupwindow.showAsDropDown(ComboBox.this, 0, 0);

} else {

m_popupwindow.showAtLocation(m_Button, Gravity.TOP | Gravity.START,location[0],location[1] - measuredHeight);

}

2.0 以上是基于Activity这个窗口的,如果是在Activity中弹出PopupWindow 而PopupWindow中的数据点击继续弹出PopupWindow呢,像这种数据

QQ图片20170316133454.jpg

弹出来的PopupWindow 是不是在底部了,理论上来说应该是底部高度不足的话,应该从上方进行弹出。如果我们还是规规矩矩的按照上面的那个写法来进行写的话肯定会发现有问题

m_Linearlayout.getLocationOnScreen(location);

下面来进行剖析一下

QQ图片20170316110400.png

QQ图片20170316110405.png

getLocationOnScreen 和 getLocationInWindow()方法区别

QQ图片20170316135514.png

getLocationInWindow是以B为原点的C的坐标

getLocationOnScreen以A为原点。

有些朋友可能明白了,是的~在弹窗中调用PopupWindow是使用getLocationInWindow。如果想将2.0中的那个PopupWindow弹出放到控件上方的话其实就很简单了

m_Linearlayout.getLocationInWindow(location);

m_popupwindow.showAtLocation(m_Button, Gravity.TOP | Gravity.START,location[0],location[1] - measuredHeight);

放在控件的下方的很很简单和之前的一样

m_popupwindow.showAsDropDown(m_Button, 0, 0);

忙碌了一下,发现想把这个写成通用控件,如何来进行和在Activity中判断一致自定来判断底部距离来展示popupwindow是向上还是向下呢?代码其实也很简单!分析一下,将弹出框的总宽度计算出来,然后用屏幕高度来减去当前窗口,得到的是空闲高度用之前的Activity判断的方法减去这个空闲高度是不是就可以了呢?

location_dialog = new int[2];

dialogView.getLocationOnScreen(location_dialog);

location_dialog[1] += dialogView.getMeasuredHeight();

boolean isNeedShowUp = (location_dialog[1] - (screenHeight - location_dialog[1]) - location[1] - m_Linearlayout.getHeight() < measuredHeight);

接下来看看效果!

QQ图片20170316142326.jpg

居然真的跑上去了

再来看看在Activity中的时候

QQ图片20170316142958.jpg

也是可以正常上去的。

android 向上弹出,android 弹出Popupwindow 自适用(Activity或者Dialog)判断向上还向下...相关推荐

  1. 【Android】Activity和PopupWindow都实现从底部弹出或滑出选择菜单或窗口

    使用Activity和PopupWindow都实现从底部弹出或滑出选择菜单或窗口 [Android]测试与popwindow PopupWindow转载自:Android PopupWindow实现从 ...

  2. android 浮层菜单弹出,Android PopupWindow实现微信右上角的弹出菜单

    日常开发过程中对于PopupWindown的使用也是比较多的.这里给大家展示一下PopupWindow的使用. 修改activity_main.xml布局: xmlns:tools="htt ...

  3. android 初学者实现 popupwindow的自动弹出,Android popupWindow弹出窗体实现方法分析

    本文实例讲述了Android popupWindow弹出窗体实现方法.分享给大家供大家参考,具体如下: 1. 建立popupwindow显示的布局页面(普通的view任意布局) android:lay ...

  4. android PopupWindow实现从底部弹出或滑出选择菜单或窗口

    android PopupWindow实现从底部弹出或滑出选择菜单或窗口 http://www.open-open.com/lib/view/open1379383271818.html http:/ ...

  5. android微信点赞ui,Android中使用PopupWindow 仿微信点赞和评论弹出

    微信朋友圈的点赞和评论功能,有2个组成部分:左下角的"更多"按钮:点击该按钮后弹出的对话框: PopupWindow,弹出框使用PopupWindow实现,这是点赞和评论的载体,具 ...

  6. Android 点击赞时弹出+1向上弹出动画

    一.前言: 项目中用到的抽出来 二.具体实现: 1.MainActivity package com.merbng.zanDemo;import android.os.Bundle; import a ...

  7. android 微信点赞功能,Android 仿微信点赞和评论弹出框

    wjntekaqskfhwktpgpvzhp 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 左下角的"更多"按钮: 点击该按钮后弹出的对话框: 微信朋友圈点赞和评 ...

  8. android+底部评论框,Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)...

    实现的效果图: 自定义Fragment继承BottomSheetDialogFragment 重写它的三个方法: onCreateDialog() onCreateView() onStart() 他 ...

  9. android studio菜单自动弹出,Android实现微博菜单弹出效果

    先上Android仿微博菜单弹出效果图,这个截图不是很流畅,大家可以下载apk试一下. 说一下实现思路: 1.截取当前窗口,对图片做高斯模糊处理,将处理后的图片做popupwindow的背景图片: 2 ...

  10. android 微博底部弹出,Android实现微博菜单弹出效果

    Android实现微博菜单弹出效果 发布时间:2020-08-23 07:48:12 来源:脚本之家 阅读:89 作者:gqdy365 先上Android仿微博菜单弹出效果图,这个截图不是很流畅,大家 ...

最新文章

  1. Linux sendmail发送邮件失败诊断案例(一)
  2. Azure 6 月新公布
  3. 【最佳解法】剑指 Offer 25. 合并两个排序的链表
  4. Sharepoint学习笔记—ECM系列--根据位置设置的默认元数据值(Location-Based Metadata Defaults)...
  5. Objective-C之MRC、ARC模式下,属性修饰关键字strong、retain、assign、weak的区别和联系...
  6. wdcp mysql远程_CentOS下WDCP下的MYSQL开启远程连接
  7. 人类心理学中几乎没有人知道的东西是什么?
  8. 项目review会议的步骤_进行完美的30分钟会议的6个步骤
  9. MYSQL索引和权限管理
  10. win10+乌班图双系统安装(详细)
  11. Source Insight 3.X 插件支持utf8,完美解决中文乱码,另附优美的配置文件一份
  12. 培养好习惯是很难,但也有方法
  13. 小红书负面笔记下沉怎么办
  14. serverlet快速入门
  15. hdu_5620_KK's Steel(水题)
  16. React-native实现联系人列表分组组件
  17. java编程学习入门
  18. 编程小白入门在线求助呜呜呜
  19. 小程序scroll-view 实现两行滑动金刚区,滑动进度条
  20. IBM “New Power”五大新计划

热门文章

  1. 我错了——虚拟光驱 for linux
  2. 30. Child Labor Problem and Its Solution 童工问题及解决方法
  3. expdp 字符集从ZHS16GBK到AL32UTF8
  4. Nginx SSL 结合Tomcat 重定向URL变成HTTP的问题
  5. RMAN 数据库克隆文件位置转换方法
  6. Web Service(二):cxf 实现
  7. python 接口自动化 recharge_python接口自动化测试
  8. 拓端tecdat|python虎扑社区论坛数据爬虫分析报告
  9. Linux下监测GPU温度指令
  10. PixelShuffler原理