Android開發(fā)時有時候需要對View的可見性進(jìn)行判斷猾瘸,常見的有
public int View.getVisibility();
public boolean View.isShown();
但是這些只能簡單的判斷這個View是否可見,有時候我們需要更為復(fù)雜的功能古话,比如View的可見區(qū)域占其自身的百分比等雏吭,常見需求為滾動視頻列表時當(dāng)滑出屏幕外一定百分比時暫停播放等。
View.getLocalVisibleRect(Rect rect)
這個方法會返回View的可視區(qū)域的Rect對象
它有如下注意項:
- 當(dāng)View可見時陪踩,無論是否完全可見杖们,Rect內(nèi)的坐標(biāo)所在坐標(biāo)系的原點為View自己的坐標(biāo)原點
- 當(dāng)View不可見時,Rect內(nèi)的坐標(biāo)所在坐標(biāo)系的原點為View的父控件的坐標(biāo)原點
圖解
- View可見
-
部分可見肩狂,底部滑入
底部滑入.png
rect:left=0,top=0,right=990,bottom=150;
因為View可見時是以自己為坐標(biāo)系計算的摘完,所以left和top都為0,right為自身寬度婚温,bottom為可視區(qū)域高度
-
部分可見描焰,頂部滑出
頂部滑出.png
rect:left=0,top=150,right=990,bottom=300;
因為View可見時是以自己為坐標(biāo)系計算的,所以left為0栅螟,top為滑出ScrollView的高度150荆秦,right為自身寬度,bottom為View自身高度
-
完全可見
完全可見.png
rect:left=0,top=0,right=990,bottom=300;
因為View可見時是以自己為坐標(biāo)系計算的力图,所以left和top都為0步绸,right為自身寬度,bottom為View自身高度
2.不可見
-
在底部
底部不可見.png
rect:left=15,top=2060,right=1005,bottom=2360;
因為View不可見時是以父控件為坐標(biāo)系計算的
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是否在可視區(qū)域內(nèi)
不難看出,當(dāng)View不在可視區(qū)域內(nèi)時
- 在頂部赘那,Rect.top <0
- 在底部刑桑,Rect.bottom>View.getHeight
所以
public boolean isVisible(Rect rect){
return !(rect.top<0||rect.bottom>getHeight());
}
判斷View可視區(qū)域占其自身百分比
public int getVisibilePercent(Rect rect){
return rect.height() * 100 / getHeight();
}
結(jié)束語
圖是用畫圖畫的,將就看募舟,手動滑稽