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,如需转载请自行联系原作者

目录
打赏
0
0
0
0
106
分享
相关文章
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
330 0
阿里云容器镜像加速器
使用容器时一般需要首先下载一个容器镜像,例如Docker Hub官方提供的MySQL、WordPress等容器镜像。然而由于网络原因,下载一个Docker官方镜像可能会需要很长的时间,甚至下载失败。为此,阿里云容器镜像服务ACR提供了官方的镜像站点,从而加速官方镜像的下载。 ## 获取镜像加速器地址 ACR会为每一个账号(阿里云账号或RAM用户)生成一个镜像加速器地址,配置镜像加速器前,您需要获取镜像加速器地址。
3129 0
数据库库表结构设计:原理、实例与最佳实践
数据库库表结构设计:原理、实例与最佳实践
3503 0
Android TabLayout的使用详解
Android TabLayout的使用详解
238 0
关于android 字体设置为中等粗细
Android TextView设置字体粗细只有三种状态,textStyle取值只有bold、nomral、italic、客户需求是字体是medium粗细,只因ios是有medium属性,Android被要求要一样;
1564 0
关于android 字体设置为中等粗细
蚂蚁智能内容合规产品,提供一站式营销合规管控解决方案
蚂蚁数科全栈式智能内容合规审核平台产品基于AI智能技术及专业内容审核规则沉淀,向金融、互联网、政企、传媒等行业客户提供一站式智能内容合规审核解决方案,可助力机构有效降低营销合规风险。
1244 0
蚂蚁智能内容合规产品,提供一站式营销合规管控解决方案
【SpringCloud-Alibaba系列教程】9.Fegin整合sentinel
接下来的章节,White带着大家以微服务架构和设计模式落地实战的方式,进行讲解和实现SpingCloud的代码开发。本章节主要使用sentinel更加优雅,与Fegin结合。
578 0
【SpringCloud-Alibaba系列教程】9.Fegin整合sentinel
Android颜色透明度颜色值说明表
Android颜色透明度颜色值说明表
970 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问