這篇文章講的方法全是再控件可以獲取焦點的情況下執行的,如果在oncreat()里面執行,那么得到的都是0
1.getLocationInWindow
這個方法得到的是view相對於當前Activity的左上角坐標。
例子:
如果你的view長寬為162,view現在正好位於屏幕的左上角,那么得到的結果是(0,162),就是view的左上角的坐標。

//得到這個view左上角的坐標(相對於當前Activity) int[] position01 = new int[2]; imageView.getLocationInWindow(position01); Log.d(tag, "getLocationInWindow:" + position01[0] + "," + position01[1]);
2.getLocationOnScreen
得到view相對於整個屏幕的左上角坐標,現在得到的是(0,162)

//得到view的左上角坐標(相對於整個屏幕) int[] position02 = new int[2]; imageView.getLocationOnScreen(position02); Log.d(tag, "getLocationOnScreen:" + position02[0] + "," + position02[1]);
這里獲得的是view左上角x,y的絕對坐標,如果view超出了屏幕,得到的坐標就是負數
3.getGlobalVisibleRect
得到整體相對於屏幕的區域范圍(Rect),這個rect表示當前view的范圍。通過上面的分析,我們可以容易知道這個rect的各個坐標是:
(0,162——160,322)

// 得到相對於整個屏幕的區域坐標(左上角坐標——右下角坐標) Rect viewRect = new Rect(); imageView.getGlobalVisibleRect(viewRect); Log.d(tag, viewRect.toString());
通過這個方法得到的是view理論可見區域的大小,為什么說理論呢?因為如果view被某個view遮擋了,通過這個方法獲得的結果還是一樣的。注意下這個方法調用后會直接改變Rect的值,而且它還有個返回值。如果返回值是true,說明view全部或者一部分在屏幕中(即使被actionbar或者statusBar遮擋),這時得到的rect的寬高是在屏幕中的寬高,但坐標永遠是大於0的,不會出現top或者left小於0的情況。如果返回的是false,那么說明這個view當前完全處於屏幕之外,並且這時候rect的寬高是view的本身寬高。
我為了得到view的絕對坐標和本身寬高寫了這個方法,第二個方法沒有進行詳細的測試,僅僅說明意思。
package com.kale.activityoptionstest; import android.graphics.Rect; import android.view.View; /** * @author:Jack Tony * @tips :得到view相對於屏幕的左上角的絕對坐標,還有view的本身寬高 * 這個寬高和view當前顯示的區域無關 * @date :2014-11-24 */ public class Position { public static Rect getGlobalVisibleRect(View v) { //得到view的左上角坐標(相對於整個屏幕) int[] position = new int[2]; v.getLocationOnScreen(position); Rect mRect = new Rect(); mRect.left = position[0]; mRect.top = position[1]; mRect.right = mRect.left + v.getWidth(); mRect.bottom = mRect.top + v.getHeight(); return mRect; } /** * @param v * @return 得到view當前真實顯示的位置和大小,超過屏幕顯示的大小就是0 */ public static Rect getRealVisibleRect(View v) { //得到view的左上角坐標(相對於整個屏幕) int[] position = new int[2]; v.getLocationOnScreen(position); Rect bounds = new Rect(); boolean isInScreen = v.getGlobalVisibleRect(bounds); Rect mRect = new Rect(); mRect.left = position[0]; mRect.top = position[1]; if (isInScreen) { mRect.right = mRect.left + bounds.width(); mRect.bottom = mRect.top + bounds.height(); }else { mRect.right = mRect.left; mRect.bottom = mRect.top; } return mRect; } }
4.getLocalVisibleRect
得到自己顯示的區域,這個區域的坐標是相對自身的,僅僅用來表示自身所占的范圍。左上角坐標一直為(0,0),右下角通過計算可得
(0,0——160,160)
// 得到自己的可見的區域坐標,左上角坐標總是(0,0) Rect globeRect = new Rect(); imageView.getLocalVisibleRect(globeRect); Log.d(tag, globeRect.toString());
5.相對父控件的坐標
下面的各種坐標全是相對於父控件的,是相對值。這些值取決於view在父控件中的位置,認為父控件的左上角永遠是(0,0)
//下面得到的坐標是相對於自己的父控件來說的,以父控件的左上角為(0,0) Log.d("demo", "X = "+ imageView.getX()); Log.d("demo", "Y = "+ imageView.getY()); Log.d("demo", "left:" + imageView.getLeft()); Log.d("demo", "right:" + imageView.getRight()); Log.d("demo", "Top:" + imageView.getTop()); Log.d("demo", "Bottom:" + imageView.getBottom());
PS: 這些方法可以在按鈕的onclick中進行執行,可以得到正確的結果。部分測試代碼如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.main_imageView); Button btn = (Button) findViewById(R.id.test_button); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO 自動生成的方法存根 getXY(); } }); } protected void getXY() { //得到這個view左上角的坐標(相對於當前Activity) int[] position01 = new int[2]; imageView.getLocationInWindow(position01); Log.d(tag, "getLocationInWindow:" + position01[0] + "," + position01[1]); //得到view的左上角坐標(相對於整個屏幕) int[] position02 = new int[2]; imageView.getLocationOnScreen(position02); Log.d(tag, "getLocationOnScreen:" + position02[0] + "," + position02[1]); // 得到相對於整個屏幕的區域坐標(左上角坐標——右下角坐標) Rect viewRect = new Rect(); imageView.getGlobalVisibleRect(viewRect); Log.d(tag, viewRect.toString()); // 得到自己的可見的區域坐標,左上角坐標總是(0,0) Rect globeRect = new Rect(); imageView.getLocalVisibleRect(globeRect); Log.d(tag, globeRect.toString()); //下面得到的坐標是相對於自己的父控件來說的,以父控件的左上角為(0,0) Log.d("demo", "X = "+ imageView.getX()); Log.d("demo", "Y = "+ imageView.getY()); Log.d("demo", "left:" + imageView.getLeft()); Log.d("demo", "right:" + imageView.getRight()); Log.d("demo", "Top:" + imageView.getTop()); Log.d("demo", "Bottom:" + imageView.getBottom()); }
參考自:http://www.fengfly.com/plus/view-209439-1.html
