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. 24种设计模式--建造者模式【Builder Pattern】

    在一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我“牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制作了,不过这次又额外增加了一个新需求:汽车的启动.停止.喇 ...

  2. [学习笔记]设计模式之Command

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 在上篇Chain of Responsibility(职责链)模式笔记中,我们学习了一种行为型设计模式.今天,我们继续这一主题,来学习 ...

  3. npm 好用工具 for 前端

    1. caniuse npm install -g caniuse-cmd

  4. windows 安装maven 环境

    1.maven 下载地址: http://maven.apache.org/index.html 2.解压到目录并配置环境变量 M2_HOME   D:\maven\maven path       ...

  5. jQuery插件综合应用(三)发布文章页面

    一.使用的插件 一个折叠的功能导航,由Akordeon插件实现.Nanoscroller插件与Tagit插件主要用于美化页面.这里只是测试,其实还可以综合使用其它的插件,例如将Akordeon插件换成 ...

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

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

  7. SQL70001: This statement is not recognized in this context.

    关于错误: SQL70001: This statement is not recognized in this context. 的产生原因以及解决办法.   在SQL Server Databas ...

  8. 大数据技术人年度盛事! BDTC 2016将于12月8-10日在京举行

    2016年12月8日-10日,由中国计算机学会(CCF)主办,CCF大数据专家委员会承办,中国科学院计算技术研究所和CSDN共同协办的2016中国大数据技术大会(Big Data Technology ...

  9. namenode启动参数

    namenode启动参数:-Xmx153600m -Xms153600m -Xmn4096m -verbose:gc -Xloggc:$LOG_DIR/namenode.gc.log -XX:Erro ...

  10. C#中的泛型-1

    在软件这个行业,做的越久,往往会觉得很多技术问题最终会偏向数据结构和算法. 记得曾经大学的一堂课上,老师讲了一个关于冒泡排序的算法,下面是课本上的标准实现. public class Sort { p ...