Android View 滾動邊界的測量

最近一直在用Android TV的RecyclerView,實現視頻搜索列表卡片的滾動顯示,因爲採用了雙排滾動,打破了系統默認的單排滾動,且每一屏幕顯示10個完整卡片5個半漏邊卡片,每一個完整卡片的左下角有個數字角標(1~10),經過語音說出數字角標後可以打開對應的卡片節目。RecyclerView的雙排滾動着實麻煩,由於打破了原有的機制,連續滾動過程當中常常會出現焦點亂跳或者丟失以及顯示錯位等等問題。因爲滾動要嚴格保持對齊且要配合語音識別位置,這其中設計到不少關聯細節。這裏只記錄view的邊界測量,通過對比測試,確實頗有效。ide

1、關於屏幕絕對座標,getLocationOnScreen與getLocationInWindow測試

View.getLocationInWindow(int[] location)  <-> 一個控件在其父窗口中的座標位置spa

View.getLocationOnScreen(int[] location) <-> 一個控件在其整個屏幕上的座標位置.net

getLocationInWindow : 計算該視圖在它所在的widnow的座標x,y值,//獲取在整個窗口內的絕對座標設計

getLocationOnScreen:  計算該視圖在全局座標系中的x,y值,(注意這個值是要從屏幕頂端算起,也就是索包括了通知欄的高度)//獲取在當前屏幕內的絕對座標3d

getLeft , getTop, getBottom, getRight, 這一組是獲取相對在它父親裏的座標。視頻

注意其參數location:blog

int[] location = new  int[2] ;get

location [0]--->x座標,location [1]--->y座標io

2、關於滾動距離偏移計算: 

(1)computeVerticalScrollOffset():已經向下滾動的距離,爲0時表示已處於頂部。

(2)computeVerticalScrollRange():總體的高度,注意是總體,包括在顯示區域以外的。

(3)computeVerticalScrollExtent():顯示區域的高度。

圖示以下: 

當Offset大於0時,顯示區域能夠繼續上移(PageUPKeyUp,即view可繼續下拉),當Offset等於0時,不能夠繼續上移。

當Range大於Offset加上Extent時,顯示區域能夠繼續下移(PageDownKeyDown, 即view能夠繼續上拉),當Range等於Offset加上Extent時,不能夠下移。

(能夠看到上面判斷上拉時多減了一個1,是由於計算過程當中有些float和int的轉換,多減個1是爲了保險起見,最多也就是吃掉view一個像素的高度而已)

計算滾動到最底部的方法,示例:

public boolean isSlideToBottom() {
if (computeVerticalScrollExtent() + computeVerticalScrollOffset()
>= computeVerticalScrollRange())
return true;
return false;
}
相關文章
相關標籤/搜索