getLocationOnScreen 計算該視圖在全局坐標系中的x,y值,(注意這個值是要從屏幕頂端算起,也就是包括了通知欄的高度)//獲取在當前屏幕內的絕對坐標
getLocationInWindow 計算該視圖在它所在的widnow的坐標x,y值,//獲取在整個窗口內的絕對坐標
getLeft , getTop, getBottom, getRight, 這一組是獲取相對在它父親里的坐標
int[] location = new int[2] ;
view.getLocationInWindow(location); //獲取在當前窗口內的絕對坐標,當前activity顯示的大小
view.getLocationOnScreen(location);//獲取在整個屏幕內的絕對坐標,包括通知欄
location [0]--->x坐標,location [1]--->y坐標
getLocationInWindow的使用見: PopupWindow彈出窗口的使用
其實只要把下面這張圖看明白就沒問題了。
涉及到的方法一共有下面幾個:
view獲取自身坐標:getLeft(),getTop(),getRight(),getBottom() 相對於父控件的距離 需要注意的是這四個方法獲取的坐標表示的是 View 原始狀態時相對於父容器的坐標,對 View 進行平移操作並不會改變着四個方法的返回值。
所以在使用ScrollView滑動到指定View的位置時,就可以這樣做:
scrollView.smoothScrollTo(0, tagView.getTop()); //補充兩個方法 //scrollView.fullScroll(ScrollView.FOCUS_DOWN);//滾到到底部 //scrollView.fullScroll(ScrollView.FOCUS_UP);//滾到到頂部
view獲取自身寬高:getHeight(),getWidth() 高度=bottom-top 寬度=right - getLeft()
motionEvent獲取坐標:getX(),getY(), 相對於父控件的坐標 getRawX(),getRawY() 相對於屏幕的坐標
首先是view的幾個方法:
獲取自身的寬高的這兩個方法很清楚,不用多說,獲取坐標的這幾個就有點混亂了。
根據上面的圖應該會比較容易明白,圖中屏幕上放了一個ViewGroup布局,里面有個View控件
getTop:獲取到的,是view自身的頂邊到其父布局頂邊的距離
getLeft:獲取到的,是view自身的左邊到其父布局左邊的距離
getRight:獲取到的,是view自身的右邊到其父布局左邊的距離
getBottom:獲取到的,是view自身的底邊到其父布局頂邊的距離
然后是motionEvent的方法:
getX():獲取點擊事件相對控件左邊的x軸坐標,即點擊事件距離控件左邊的距離
getY():獲取點擊事件相對控件頂邊的y軸坐標,即點擊事件距離控件頂邊的距離
getRawX():獲取點擊事件相對整個屏幕左邊的x軸坐標,即點擊事件距離整個屏幕左邊的距離
getRawY():獲取點擊事件相對整個屏幕頂邊的y軸坐標,即點擊事件距離整個屏幕頂邊的距離
int newX =(int) event.getRawX(); int newY =(int) event.getRawY(); int dx = newX - startX; int dy = newY - startY; //窗體可以這樣改變坐標位置:wm.updateViewLayout(); 圖片可以改變layout imageView.layout(iv.getLeft()+dx, iv.getTop()+dy, iv.getRight()+dx, iv.getBottom()+dy);