Android View.getLocalVisibleRect

作者: 小胖熊9527 | 来源:发表于2019-05-10 17:26 被阅读110次

    Android开发时有时候需要对View的可见性进行判断,常见的有

    public int View.getVisibility();
    
    public boolean View.isShown();
    

    但是这些只能简单的判断这个View是否可见,有时候我们需要更为复杂的功能,比如View的可见区域占其自身的百分比等,常见需求为滚动视频列表时当滑出屏幕外一定百分比时暂停播放等。

    View.getLocalVisibleRect(Rect rect)

    这个方法会返回View的可视区域的Rect对象
    它有如下注意项:

    • 当View可见时,无论是否完全可见,Rect内的坐标所在坐标系的原点为View自己的坐标原点
    • 当View不可见时,Rect内的坐标所在坐标系的原点为View的父控件的坐标原点

    图解

    1. View可见
    • 部分可见,底部滑入


      底部滑入.png

    rect:left=0,top=0,right=990,bottom=150;
    因为View可见时是以自己为坐标系计算的,所以left和top都为0,right为自身宽度,bottom为可视区域高度

    • 部分可见,顶部滑出


      顶部滑出.png

    rect:left=0,top=150,right=990,bottom=300;
    因为View可见时是以自己为坐标系计算的,所以left为0,top为滑出ScrollView的高度150,right为自身宽度,bottom为View自身高度

    • 完全可见


      完全可见.png

    rect:left=0,top=0,right=990,bottom=300;
    因为View可见时是以自己为坐标系计算的,所以left和top都为0,right为自身宽度,bottom为View自身高度

    2.不可见

    • 在底部


      底部不可见.png

    rect:left=15,top=2060,right=1005,bottom=2360;
    因为View不可见时是以父控件为坐标系计算的
    ScrollView的高度为1860,加上View与ScrollView的距离200,所以top=2060
    left为View与ScrollView的margin,所以left为15
    right和bottom分别为加上View的宽度和高度

    • 在顶部


      顶部不可见.png

    rect:left=15,top=-500,right=1005,bottom=-200;

    判断View是否在可视区域内

    不难看出,当View不在可视区域内时

    • 在顶部,Rect.top <0
    • 在底部,Rect.bottom>View.getHeight
      所以
    public boolean isVisible(Rect rect){
            return !(rect.top<0||rect.bottom>getHeight());
    }
    

    判断View可视区域占其自身百分比

    public int getVisibilePercent(Rect rect){
            return rect.height() * 100 / getHeight();
    }
    

    结束语

    图是用画图画的,将就看,手动滑稽

    相关文章

      网友评论

        本文标题:Android View.getLocalVisibleRect

        本文链接:https://www.haomeiwen.com/subject/zfwaoqtx.html