getLocalVisibleRect可见区域的变化推演

getLocalVisibleRect可见区域的变化推演

官方文档

文档翻译:如果该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中返回的Rectleft、top、right、bottom四项加取反的偏移量。

屏幕左上角的座标为(0,0),view自身左上角的在屏幕上的(500,800)位置时

globalOffset.x=500;globalOffset.y=500。

getGlobalVisibleRect返回的Rect为(500,800,550,900)时

getLocalVisibleRect返回的RectGloballeft、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超出屏幕的部分的自动移动等情景。

getLocalVisibleRect

View在单横向或纵向划动的情况下,有完全不可见、部分或完全可见两种情况:

  • 二者在View还未显示已经完全移出去,即完全不可见时getLocalVisibleRectgetGlobalVisibleRect返回的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=ScreenWidthright=ScreenWidth+ViewWidth(当从座标正方向纵向进入屏幕时为top=ScreenHeightbottom=ScreenHeight+ViewHeight)

    • 当View进入屏幕后:getLocalVisibleRect返回的Rect中随移动方向变化的两项,以自身左上角为座标原点而变化。在进入屏幕的一瞬间left=0right=0(纵向情况top=0bottom=0)

      view进入屏幕的一瞬间,返回的Rect中随方向变化的两项,发生巨大变化。widthscreenwidth变为0

    • 当View完全移出屏幕前:getLocalVisibleRect自身左上角为座标原点,跟屏幕原点无关,所以自身的左上角已在屏幕之外也没有关系。此时的Rect中随移动方向变化的两项left=viewwidthright=viewwidth

    • 当View完全移出屏幕后:getLocalVisibleRect返回的Rect中随移动方向变化的两项,以屏幕左上角为座标原点而变化。left=-viewwidthright=0

      view完全移出屏幕的一瞬间,返回的Rectleftviewwidth变成-viewwidth

如当view横向从屏幕外进入屏幕,完全移出屏幕时getLocalVisibleRect返回的Rectleft的变化

在屏幕外很远处进入屏幕前进入屏幕后完全移出前完全移出后继续移
screenWidth0width-width-∞

总结:

View完全不显示时,二者返回的Rect相同,其中随移动方向变化的两项,参照屏幕左上角而变化;不变的两项参照自身左上角保持不变。

View部分或完全显示时,getGlobalVisibleRect显示的区域屏幕左上角为座标原点的Rect表示;getLocalVisibleRect显示的区域自身左上角为座标原点的Rect表示。二者可通过对返回的Rect做加上或减去屏幕左上角和view左上角之间的偏移量而互换。

当View在完全不显示部分或完全显示之间变化时,getLocalVisibleRect返回的Rect 在屏幕左上角和平补左上角不同参照系中切换,会产生特殊的邻接值变化。

分类:
Android