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

相关文章
|
Android开发 Kotlin
Android 获取当前的类名,包名,路径等
在做项目时,无论为了功能还是调试,很多时候都需要获取到当前类的类名,包名,路径等等。 在这里总结一下,以便总结和以后需要的时候更快的解决问题。
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
241 0
|
Android开发
Android中的WebView之loadDataWithBaseURL()与loadData()
Android中的WebView之loadDataWithBaseURL()与loadData() WebView 加载数据的常用的几种方法如下: public void loadUrl(String url, Map additionalHttpH...
2146 0
|
移动开发 JavaScript 前端开发
|
人工智能 安全 开发者
AI辅助软件开发:代码自动补全和错误检测
在软件开发的过程中,编写高质量的代码是至关重要的。然而,编写大量的代码并保证其准确性和完整性是一项具有挑战性的任务。幸运的是,现代的软件开发中出现了AI辅助工具,能够提供代码自动补全和错误检测的功能。本文将介绍这些功能的优势,并演示如何使用AI辅助工具来提高开发效率和代码质量。
1021 0
|
缓存 Android开发
Android TabLayout的使用详解
Android TabLayout的使用详解
124 0
|
IDE 开发工具 Android开发
ProGuard的各种参数说明(2)
ProGuard的各种参数说明(2)
221 0
|
测试技术 Android开发
Android获取启动页面Activity方法总结
我们在做Android自动化测试过程中,经常会需要获取应用的启动Activity页面信息,那么今天就来跟大家分享一下有哪些获取应用启动Activity页面信息的方法。
989 0
Android获取启动页面Activity方法总结
|
Android开发
Android颜色透明度颜色值说明表
Android颜色透明度颜色值说明表
741 0
|
移动开发 前端开发 rax
weex开发android应用
weex使用简要介绍
486 0
weex开发android应用