Android开发时有时候需要对View的可见性进行判断,常见的有
public int View.getVisibility();
public boolean View.isShown();
但是这些只能简单的判断这个View是否可见,有时候我们需要更为复杂的功能,比如View的可见区域占其自身的百分比等,常见需求为滚动视频列表时当滑出屏幕外一定百分比时暂停播放等。
View.getLocalVisibleRect(Rect rect)
这个方法会返回View的可视区域的Rect对象
它有如下注意项:
- 当View可见时,无论是否完全可见,Rect内的坐标所在坐标系的原点为View自己的坐标原点
- 当View不可见时,Rect内的坐标所在坐标系的原点为View的父控件的坐标原点
图解
- 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();
}
结束语
图是用画图画的,将就看,手动滑稽
网友评论