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源码分析的更多相关文章

  1. Android View事件分发-从源码分析

    View事件分发-从源码分析 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/details/78555397?lo ...

  2. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  3. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  4. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  5. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  6. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  7. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  8. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  9. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

随机推荐

  1. APACHE 与IIS同时存在的情况下,给APACHE添加反向代理 共用80端口

    一.首先打开IIS,将IIS的端口改成81,不要让IIS占用了80端口 二.打开APACHE的httpd.conf配置文件,将里面的端口配置成80 三.打开APACHE的虚拟目录配置文件,如:http ...

  2. PoshyTip jQuery 文本提示插件的使用

    PoshyTip 是JQuery中一款文本提示插件,在Jsp页面使用相当方便,插件内包含了很多外观样式,可以作为FormTooltips使用. 插件包下载地址:http://vadikom.com/f ...

  3. VB版本查询快递单号源码

    能查询各大快递单号,包括申通快递,圆通快递,韵达快递等国内超过90家以上快递单号查询, 如果想快速搭建一个快递单号查询站我推荐这个,这是地址www.aikuaidi.cn,我分享一个VB Functi ...

  4. 【python】二进制、八进制、十六进制表示方法(3.0以上)

    2进制是以0b开头的: 例如: 0b11 则表示十进制的3 8进制是以0o开头的: 例如: 0o11则表示十进制的9 (与2.0版本有区别) 16进制是以0x开头的: 例如: 0x11则表示十进制的1 ...

  5. UML2.0统一建模语言

      Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规 ...

  6. eclipse + maven + jboss 遇到ClassNotFoundException

    在使用eclipse + maven + jboss开发过程中,碰到ClassNotFoundException, 原因应该是deployed包中未包含maven的依赖jar. 可以通过如下方法把依赖 ...

  7. 使用PHP生成二维码的两种方法(带logo图像)

    一.利用Google API生成二维码 Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  8. 各大Oj平台介绍[转]

    1.题库与网站资源题库-在线提交系统(Online Judge)简介   下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...

  9. C语言之 短路原则

    a=0;b=1 c=a&&(b=3) 最终c=0; b=1 因为从左至右进行时,若遇到运算符左边的操作数是 0(逻辑假),则停止运算. a=1;b=1;c=0; d=a||b||(c= ...

  10. Match & Catch

    Codeforces Round #244 (Div. 2) D:http://codeforces.com/contest/427/problem/D 题意:给你两个串,让你找一个最小的串,并且这个 ...