1. 相對位置:
getLeft() , getRight(), getTop(), getBottom()
在Android中可以把left相當於X軸值, top相當於Y軸值, 通過這兩個值Android系統可以知道視圖的繪制起點,在通過Wdith 和 Height 可以得到視圖上下左右具體值,就可以在屏幕上絕對位置繪制視圖。right 與 bottom計算如下:
right = left + width;
bottom = top + height;
視圖左側位置 view.getLeft()
視圖右側位置 view.getRight()
視圖頂部位置 view.getTop();
視圖底部位置 view.getBottom();
視圖寬度 view.getWidth();
視圖高度 view.getHeight()
錯誤的理解,綠色區域的位置是針對於藍色區域的(0, 0)坐標的值,從上圖的右下角打印出的坐標值就可以看出與下方我列出的值不一致,
看看下面的圖就明白了
藍色區域位置 left = 0, top = 0 坐標(0, 0 )
黃色區域位置 left = 60, top = 115 坐標(60, 115)
綠色區域位置 left = 115, top = 170 坐標(115, 170)
總結: 視圖的left , top , right , bottom 的值是針對其父視圖的相對位置, 綠色區域是針對其父視圖(即黃色區域為(0, 0)點)的坐標,不應該是(115, 170 ) 而是 (55, 55)
2. 絕對位置:
- getLocalVisibleRect
- getGlobalVisibleRect
- getLocationOnScreen
- getLocationInWindow
1)getLocationInWindow
-
int[] position = new int[2];
-
textview.getLocationInWindow(position);
-
System.out.println("getLocationInWindow:" + position[0] + "," + position[1]);
這個方法是將view的左上角坐標存入數組中.此坐標是相對當前activity而言.
若是普通activity,則y坐標為可見的狀態欄高度+可見的標題欄高度+view左上角到標題欄底部的距離.
可見的意思是:在隱藏了狀態欄/標題欄的情況下,它們的高度以0計算.
若是對話框式的activity,則y坐標為可見的標題欄高度+view到標題欄底部的距離.
此時是無視狀態欄的有無的.
2)getLocationOnScreen
-
int[] position = new int[2];
-
textview.getLocationOnScreen(position);
-
System.out.println("getLocationOnScreen:" + position[0] + "," + position[1]);
這個方法跟上面的差不多,也是將view的左上角坐標存入數組中.但此坐標是相對整個屏幕而言.
y坐標為view左上角到屏幕頂部的距離.
3)getGlobalVisibleRect
-
Rect viewRect = new Rect();
-
textview.getGlobalVisibleRect(viewRect);
-
System.out.println(viewRect);
這個方法是構建一個Rect用來"套"這個view.此Rect的坐標是相對當前activity而言.
若是普通activity,則Rect的top為可見的狀態欄高度+可見的標題欄高度+Rect左上角到標題欄底部的距離.
若是對話框式的activity,則y坐標為Rect的top為可見的標題欄高度+Rect左上角到標題欄底部的距離.
此時是無視狀態欄的有無的.
4)getLocalVisibleRect
-
Rect globeRect = new Rect();
-
button.getLocalVisibleRect(globeRect);
注意:
以上方法在OnCreate方法中調用,都會返回0,這是因為View還未加載完畢.
建議在onWindowFocusChanged方法中進行獲取,有些情況下onWindowFocusChanged不好用的時候(比如ActivityGroup),可以這樣寫:
-
mTextView.post(new Runnable() {
-
@Override
-
public void run() {
-
Rect viewRect = new Rect();
-
mTextView.getLocalVisibleRect(viewRect);
-
mTreeScrollView.setRect(viewRect);
-
}
-
});
這樣在View加載完畢之后會執行獲取位置的方法.