官方文档
文档翻译:如果该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().addOnGlobalLayoutListenerview摆放完成后使用。
应用
两个方法都有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=0view完全移出屏幕的一瞬间,返回的
Rect中left从viewwidth变成-viewwidth
-
如当view横向从屏幕外进入屏幕,完全移出屏幕时
getLocalVisibleRect返回的Rect的left的变化
在屏幕外很远处 进入屏幕前 进入屏幕后 完全移出前 完全移出后 继续移 ∞ screenWidth 0 width -width -∞
总结:
View完全不显示时,二者返回的Rect相同,其中随移动方向变化的两项,参照屏幕左上角而变化;不变的两项参照自身左上角保持不变。
View部分或完全显示时,getGlobalVisibleRect显示的区域以屏幕左上角为座标原点的Rect表示;getLocalVisibleRect显示的区域以自身左上角为座标原点的Rect表示。二者可通过对返回的Rect做加上或减去屏幕左上角和view左上角之间的偏移量而互换。
当View在完全不显示与部分或完全显示之间变化时,getLocalVisibleRect返回的Rect 在屏幕左上角和平补左上角不同参照系中切换,会产生特殊的邻接值变化。