PopupWindow源码分析

原创 2013年12月02日 18:39:08
PopupWindow是我们经常使用的一个控件,严格来说这个PopuWindow就用来在指定位置显示一个View。
经过分析源码,PopupWindow里面没有Window对象,只是把View设置到屏幕而已。
从构造函数中可知,我们只是把Context对象传递了过去,这个Context是Activity,通过Context获得WindowManager对象。
从源码可以得出一个结论是,即使没有Window对象,也可以添加窗口到屏幕。

构造函数就不多说了,自己看下就行。

就看下如何让PopupWindow显示出来

显示PopuWindow的时候,应用程序开发者一般调用PopupWindow的如下方法:
    public void showAsDropDown(View anchor) 
     showAsDropDown(View anchor, int xoff, int yoff)
    showAtLocation(View parent, int gravity, int x, int y) 

第一个方法调用了第二个,最后那个方法又和第二个类似,那么下面就只分析下第二个方法:

先解释下参数:
anchor:就是PopupWindow要显示的相对于谁的位置的那个谁,哈哈,这样描述的有点搞笑,就是参照的View
xoff: PopupWindow相对于anchor的左下角x轴方向的偏移大小
yoff: PopupWindow相对于anchor的左下角y轴方向的偏移大小

第800行:判断当前PopupWindow是否显示,或者mContentView是否为空,是的话就不用去继续执行下面的代码了,为什么
    不去执行,你懂的....
第804行:registerForScrollChanged(anchor, xoff, yoff);这个方法起名起的也很有意思,为了滑动改变注册,就是有可能anchor有
        滑动,或者ContentView过大,有的地方放不开。
  就是注册一下滑动的全局的监听,注册之前先注销一下之前的注册,防止ViewTreeObserver失效。
 在这里使用了一个弱引用对anchor,防止anchor这个类已经无用了,anchor仍然无法回收内存。
806行:把mIsShowing设置为true,代表正在处于PopupWindow的显示过程。
807行:mIsDropdown设置为true,代表是防止anchor下面
809行:为PopupWindow设置显示参数,调用了createPopupLayout(anchor.getWindowToken())
看下这个方法:
(1)创建一个WindowManager.LayoutParams的实例p
(2)设置一些参数
   设置了gravity,width,heigt
   设置format
   couputeFlags()方法,为p设置了一系列的flag,设置flag的时候也很有意思,使用这些运算符~、&、|
   设置了输入法模式
   设置标题
第810行:使用p准备popupwindow,就是为创建popupwindow做一些必要的准备工作,一会解释一下怎么准备的
867行:做了一些必要的检查,在写程序的时候就不能出错的地方
872行:如果mBackground不为null的话(背景不为空的话),接着就创建一个PopuViewContainner,这个FrameLayout的一个子类,
        把背景设置给PopuViewContainner,然后再把mContentView放进去,然后把PopuViewContainner赋值给mPopupView,返回回去
        否则的话mPopupView就是mContentView
893,894行,把高度和宽度分别赋值一下mPopupWidth和mPopupHeight

回到showAsDropDown()方法继续分析
812行:方法updateAboveAnchor(findDropDownPosition(anchor, p, xoff, yoff));主要是用来计算mPopupView显示的位置和层次,还有
        当位置不够,滑动时处理的一些东西,自己详细的分一下即可。
817行:p.windowAnimations = computeAnimationResource();就是用来设置一些显示动画

819行:invokePopup(p);才是真正的把PopupWindow显示在特定的位置上。其实就使用Activity中的WindowManager对象对mPopupView进行了添加显示。

还有一点需要注意的是PopupWindow是什么类型的窗口,可以明确的说是子窗口,因为在PopupWindow这个类里面定义了窗口类型
TYPE_APPLICATION_PANEL就是子窗口,默认的第一种子窗口


先写到这里,个人能力有限,难免会出现错误,如发现错误敬请指正。

读源码:PopupWindow

读源码是为了了解并学习它的实现机制,并更好的运用它,如果在读源码之前已经知道它的怎么运用,这将会更容易理解源码。所以在这读源码开头我推荐阅读一下一位大神写的相关博文,浅显易懂,条理清晰: PopUp...
  • u012585964
  • u012585964
  • 2016年08月12日 00:31
  • 1257

安卓PopupWindow使用详解与源码分析(附项目实例)

基本用法首先定义弹窗的Layout文件res/layout/popup_window.xml
  • jzj1993
  • jzj1993
  • 2015年09月19日 11:12
  • 1367

popupwindow的源码分析

闲来无事把popupwindow的源码看了一遍,能力有限只看懂了一部分。下面我们来看看源码: private int mWindowLayoutType = WindowManager.Layout...
  • u011007829
  • u011007829
  • 2015年08月06日 13:34
  • 1230

PopupWindow源码分析

转自:http://www.eoeandroid.com/thread-315263-1-1.html ------------------------------------------------...
  • zi413293813
  • zi413293813
  • 2014年01月11日 17:22
  • 699

博客《 PopUpWindow使用详解(一)——基本使用》对应源码

  • 2015年10月20日 08:52
  • 634KB
  • 下载

自定义单选、多选对话框及popupwindow窗口实例源码

  • 2018年01月05日 19:34
  • 65B
  • 下载

博客《PopUpWindow使用详解(二)——进阶及答疑》对应源码

  • 2015年10月20日 16:43
  • 384KB
  • 下载

仿微信popupwindow,android源码

  • 2015年09月30日 15:47
  • 1.13MB
  • 下载

android PopupWindow的使用(带动画效果)源码

  • 2014年12月17日 10:10
  • 363KB
  • 下载

popupwindow源码

  • 2015年09月05日 16:52
  • 1.3MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PopupWindow源码分析
举报原因:
原因补充:

(最多只允许输入30个字)