官方文档
文档翻译:如果该view的某些区域未被父view给clipped,then就通过r 根据全局(根)座标返回这些区域。
若通过r 根据当前座标返回的话,对其做偏移r.offset(-globalOffset.x, -globalOffset.y)
如果该view完全被父view给clip掉,或已经平移出去则返回false
由文档可知,在View部分或完全显示时:
getGlobalVisibleRect
显示的区域以屏幕左上角为座标原点的Rect表示
getLocalVisibleRect
显示的区域以自身左上角为座标原点的Rect表示
屏幕左上角和view左上角存在偏移量。在view部分或完全显示的情况下,getLocalVisibleRect
返回的Rect
等于对getGlobalVisibleRect
中返回的Rect
的left、top、right、bottom
四项加取反的偏移量。
屏幕左上角的座标为(0,0),view自身左上角的在屏幕上的(500,800)位置时
globalOffset.x=500;globalOffset.y=500。
当
getGlobalVisibleRect
返回的Rect
为(500,800,550,900)时和
getLocalVisibleRect
返回的Rect
是Global
的left、right
-500top、bottom
-800,(0,0,50,100)
两个方法同
getLocationInWindow/InSurface/OnScreen
(获得在目标容器中定位:int[])一样。最好在view.getViewTreeObserver().addOnGlobalLayoutListener
view摆放完成后使用。
应用
两个方法都有boolean
返回值,用来判断view显示与否。
两个方法对于被同一级view遮挡的view还是判断为显示的,同一级view盖在一起只算重复绘制。子view超出了父view的区域被父view给clipped裁切掉;或子view从父view中移动出去才判断为不显示。
在实际开发中,不但会在view显示的情况下求其显示区域。还会在未显示的情况下获得其返回的Rect。如横向tab超出屏幕的部分的自动移动等情景。
View在单横向或纵向划动的情况下,有完全不可见、部分或完全可见两种情况:
-
二者在View还未显示或已经完全移出去,即完全不可见时:
getLocalVisibleRect
和getGlobalVisibleRect
返回的Rect
相同。-
left、top、right、bottom
其中随移动方向变化的两项,以屏幕左上角为座标原点而变化; -
另外不变化的两项,以view自身左上角为座标原点相对值,并保持不变。
如横向移动时,
left、right
的值参照左边原点而变化,top、bottom
的值参照自身取0和height保持不变
-
-
二者在View部分或完全可见时返回的
Rect
是:getGlobalVisibleRect
显示的区域以屏幕左上角为座标原点的Rect表示(别忘了Rect中不随view移动而变化的两项也要换成屏幕左上角的绝对座标)getLocalVisibleRect
显示的区域以自身左上角为座标原点的Rect表示
-
当View在完全不显示与部分或完全显示之间变化时,如从座标正方向即将开始进入屏幕或即将完全移出屏幕时
getLocalVisibleRect
返回的Rect
会有特别的变化。-
当View进入屏幕前:
getLocalVisibleRect
返回的Rect
中随移动方向变化的两项,以屏幕左上角为座标原点而变化。在进入屏幕前达到极值left=ScreenWidth
、right=ScreenWidth+ViewWidth
(当从座标正方向纵向进入屏幕时为top=ScreenHeight
、bottom=ScreenHeight+ViewHeight
) -
当View进入屏幕后:
getLocalVisibleRect
返回的Rect
中随移动方向变化的两项,以自身左上角为座标原点而变化。在进入屏幕的一瞬间left=0
、right=0
(纵向情况top=0
、bottom=0
)view进入屏幕的一瞬间,返回的
Rect
中随方向变化的两项,发生巨大变化。width
从screenwidth
变为0
-
当View完全移出屏幕前:
getLocalVisibleRect
以自身左上角为座标原点,跟屏幕原点无关,所以自身的左上角已在屏幕之外也没有关系。此时的Rect
中随移动方向变化的两项left=viewwidth
、right=viewwidth
-
当View完全移出屏幕后:
getLocalVisibleRect
返回的Rect
中随移动方向变化的两项,以屏幕左上角为座标原点而变化。left=-viewwidth
、right=0
view完全移出屏幕的一瞬间,返回的
Rect
中left
从viewwidth
变成-viewwidth
-
如当view横向从屏幕外进入屏幕,完全移出屏幕时
getLocalVisibleRect
返回的Rect
的left
的变化
在屏幕外很远处 进入屏幕前 进入屏幕后 完全移出前 完全移出后 继续移 ∞ screenWidth 0 width -width -∞
总结:
View
完全不显示时,二者返回的Rect
相同,其中随移动方向变化的两项,参照屏幕左上角而变化;不变的两项参照自身左上角保持不变。
View
部分或完全显示时,getGlobalVisibleRect
显示的区域以屏幕左上角为座标原点的Rect表示;getLocalVisibleRect
显示的区域以自身左上角为座标原点的Rect表示。二者可通过对返回的Rect做加上或减去屏幕左上角和view左上角之间的偏移量而互换。
当View在完全不显示与部分或完全显示之间变化时,getLocalVisibleRect
返回的Rect
在屏幕左上角和平补左上角不同参照系中切换,会产生特殊的邻接值变化。