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()取得的值要大。

时间: 2024-07-31 14:34:40

getLocationInWindow getLocationOnScreen getLeft , getTop, getBottom,getRight的相关文章

关于 android 的 view.getLeft(), getRight(), getTop(), getBottom() 的一些疑惑(坑)解答

(原创) 今天在做下滑刷新的时候碰到 view 的四个 get 函数有点特别,具体遇到的问题如下,经反复测试和查找资料,填坑如下: 1,为什么我有时候在使用getLeft(), getRight(), getTop(), getBottom()它们得到的结果是0? 答: 出现这种情况可能是在刚启动程序,程序刚开始绘制 view 的时候,你马上使用代码去捕获上面的值.这个时候,由于view 是刚开始绘制的,你得到的就会是 0. 验证我上面的说法: new 一个线程,使用Thread.Sleep(l

Android 坐标与宽高研究getLeft() getTop() getRight()和getBottom()

把view看做一个矩形,分别表示的是一个view的左边,上边,右边,下边距离他的父组件的距离. getRight() =getLeft() + getWidth() getBottom()= getTop() + getHeight() 一.坐标研究一 每个view group包含一个宽度和高度(layout_width和layout_height),每个view必须定义它们.很多LayoutParams也包括可选的margin(空白)和border(边界). 你可以使用精确值来指定宽度和高度,

View的getLeft, getRight, getTop, getBottom

View的getLeft, getRight, getTop, getBottom方法得到的分别是相对于其父组件不同方向的距离 网上找了张图说明: 其中right和left的计算方法如下: right = left + width; bottom = top + height;

android view之getLeft(),getRight(),getTop(),getBottom(),getX(),getY(),getRawX(),getRawY(),getTranslationX(),getTranslationY()记录

自定义view时使经常使用到的view距离及坐标记录 如下 第一:view中一般用于获取view宽高 getLeft()        view本身左侧   距离父布局左侧   的距离 getRight()      view本身右侧   距离父布局左边侧  的距离 getTop()         view本身顶部   距离父布局顶部    的距离 getBottom()    view本身底部   距离父布局顶部   的距离 View的  Height = view.getBottom()

Android View坐标getLeft, getRight, getTop, getBottom

1  引起疑惑 分析视图invalidate流程的过程中发现view的left, right, top, bottom跟自己理解的不一样,现在想分析一下这几个值具体的含义. 2  理解坐标,位置概念 这里涉及坐标系的概念: 坐标系在二维视图中通过X轴和Y轴两个数字为组合表示某个点的绝对坐标. 例如(30, 100) 通常表示X轴30, Y轴100交叉的一个点 在Android中可以把left相当于X轴值, top相当于Y轴值, 通过这两个值Android系统可以知道视图的绘制起点,在通过Wdit

getLocationInWindow 和 getLocationOnScreen 区别

int[] location = new  int[2] ;view.getLocationInWindow(location); //获取在当前窗口内的绝对坐标,getLeft , getTop, getBottom, getRight,  这一组是获取相对在它父窗口里的坐标.view.getLocationOnScreen(location);//获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度.location [0]--->x坐标,location [1

getLocationInWindow和getLocationOnScreen的区别

// location [0]--->x坐标,location [1]--->y坐标int[] location = new  int[2] ;// 获取在当前窗口内的绝对坐标,getLeft , getTop, getBottom, getRight,  这一组是获取相对在它父窗口里的坐标.view.getLocationInWindow(location); // 获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度.view.getLocationOnScr

android获得控件在屏幕中的绝对坐标 getLocationInWindow 和 getLocationOnScreen

int[] location = new  int[2] ;view.getLocationInWindow(location); //获取在当前窗口内的绝对坐标view.getLocationOnScreen(location);//获取在整个屏幕内的绝对坐标location [0]--->x坐标,location [1]--->y坐标 getLocationOnScreen 得到该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内

android:PopupWindow的使用场景和注意事项

1.PopupWindow的特点 借用Google官方的说法: "A popup window that can be used to display an arbitrary view. The popup window is a floating container that appears on top of the current activity." 也就是说.popupwindow是activity上方的一个悬浮容器.它能够显示随意的视图View,非常霸气的样子. 以下看一