getLocationInWindow getLocationOnScreen getLeft , getTop, getBottom,getRight

简介:

   最近做项目时,发现在activity的onCreate()和onResume()方法里调用View.getLocationInWindow() 时,View.getLocationInWindow()返回空值,觉得很奇怪,因为以前用过,没有发现这个问题,于是调查了一下源码,这里把调查结果 做个记录。

       首先,看看View.getLocationInWindow()的实现,

[java]  view plain  copy
  1. public void getLocationInWindow(int[] location) {  
  2.     // When the view is not attached to a window, this method does not make sense  
  3.     if (mAttachInfo == null) return;  
  4.     ... ...  
  5. }  

       这里有注释,说明当view没有绑定到window时,返回在window里的坐标是没有意义的。的确,窗口都没有,哪来的窗口坐标呀!!

       其次,看看view何时合适绑定到窗口。通过阅读源码,发现下面这段代码:

[java]  view plain  copy
  1. void dispatchAttachedToWindow(AttachInfo info, int visibility) {  
  2.      //System.out.println("Attached! " + this);  
  3.      mAttachInfo = info;  
  4.      ... ...  
  5. }  

       看到这里,可能会想在activity.onAttachedToWindow()函数里是不是能通过调用 View.getLocationInWindow()取得view在window中的位置呢?实验一下,发现还是不能!!怪异了,接着再看,总结出如下 时序图:

       从上图我们可以看出activity.onAttachedToWindow()的调用在 View.dispatchAttachedToWindow()之前,此时View还是没有绑定到window上,所以在 activity.onAttachedToWindow()里调用View.getLocationInWindow()无效。       

       最后,何时调用View.dispatchAttachedToWindow()才能得到有效值呢?其实上面已经有答案了,那就是从此以后都可以了,例如activity.onWindowFocusChanged()函数。
 

备注:

// 获取在当前窗口内的绝对坐标
View.getLocationInWindow()

// 获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度。
View.getLocationOnScreen()

// 下面一组是获取相对在它父窗口里的坐标。
View.getLeft() , View.getTop(), View.getBottom(), View.getRight()

View.getLocationInWindow()和 View.getLocationOnScreen()在window占据全部 screen时,返回值相同,不同的典型情况是在Dialog中时。当Dialog出现在屏幕中间 时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5441359.html,如需转载请自行联系原作者

相关文章
|
关系型数据库 MySQL Docker
阿里云容器镜像加速器
使用容器时一般需要首先下载一个容器镜像,例如Docker Hub官方提供的MySQL、WordPress等容器镜像。然而由于网络原因,下载一个Docker官方镜像可能会需要很长的时间,甚至下载失败。为此,阿里云容器镜像服务ACR提供了官方的镜像站点,从而加速官方镜像的下载。 ## 获取镜像加速器地址 ACR会为每一个账号(阿里云账号或RAM用户)生成一个镜像加速器地址,配置镜像加速器前,您需要获取镜像加速器地址。
3909 0
|
canal 消息中间件 存储
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
1282 0
|
10月前
|
数据安全/隐私保护 索引
基于EEMD变换的ECG心电信号去噪和心率估计matlab仿真
本课题基于EEMD变换对ECG心电信号进行去噪处理,并通过MATLAB仿真实现心率估计。研究分析了不同噪声强度下心率估计的准确性,验证方法的可靠性。核心程序采用巴特沃斯滤波器对重构信号滤波,结合希尔伯特变换提取R波峰值以计算心率。系统原理利用EEMD分解有效分离信号与噪声,提升特征提取精度,为临床诊断提供技术支持。仿真结果表明,该方法在低信噪比条件下仍能保持较高的心率估计准确度。
|
存储 数据采集 JSON
彻底搞懂监控系统,使用Prometheus +Grafana搭建完整的应用监控系统
监控是运维系统的基础,我们衡量一个公司/部门的运维水平,看他们的监控系统就可以了。一个完善的监控系统可以提高应用的可用性和可靠性,在提供更优质服务的前提下,降低运维的投入和工作量,为用户带来更多的商业利益和客户体验。下面就带大家彻底搞懂监控系统,使用Prometheus +Grafana搭建完整的应用监控系统。
17307 1
彻底搞懂监控系统,使用Prometheus +Grafana搭建完整的应用监控系统
|
索引 Python 容器
Python容器专题 - deque(队列)--双向队列对象
Python容器专题 - deque(队列)--双向队列对象
400 0
|
存储 SQL 数据库
数据库库表结构设计:原理、实例与最佳实践
数据库库表结构设计:原理、实例与最佳实践
4948 0
|
存储 缓存 Java
解析 Java 数据结构:深入了解映射(Map)的特点与应用
在 Java 编程中,映射(Map)是一种非常重要的数据结构,用于存储键值对(Key-Value pairs),其中每个键都唯一对应一个值。映射在实际应用中有着广泛的应用,如数据库索引、缓存管理、配置
|
设计模式 Sentinel 微服务
【SpringCloud-Alibaba系列教程】9.Fegin整合sentinel
接下来的章节,White带着大家以微服务架构和设计模式落地实战的方式,进行讲解和实现SpingCloud的代码开发。本章节主要使用sentinel更加优雅,与Fegin结合。
672 0
【SpringCloud-Alibaba系列教程】9.Fegin整合sentinel
|
存储 机器学习/深度学习 人工智能
蚂蚁智能内容合规产品,提供一站式营销合规管控解决方案
蚂蚁数科全栈式智能内容合规审核平台产品基于AI智能技术及专业内容审核规则沉淀,向金融、互联网、政企、传媒等行业客户提供一站式智能内容合规审核解决方案,可助力机构有效降低营销合规风险。
1668 0
蚂蚁智能内容合规产品,提供一站式营销合规管控解决方案
|
JSON 自然语言处理 数据可视化
ElasticSearch 及 ElasticSearch—head 插件安装 以及 kibana 可视化工具
ElasticSearch 及 ElasticSearch—head 插件安装 以及 kibana 可视化工具
1010 0
ElasticSearch 及 ElasticSearch—head 插件安装 以及 kibana 可视化工具

热门文章

最新文章

下一篇
开通oss服务