如何獲取視圖的絕對座標

我正在嘗試獲取視圖左上角的絕對屏幕像素座標。 可是,我能夠找到的全部方法getLeft()例如getLeft()getRight()都不起做用,由於它們彷佛都相對於視圖的父級,所以給我0 。 正確的方法是什麼? 數組

若是有幫助,則用於「按順序放回圖片」遊戲。 我但願用戶可以繪製一個框來選擇多個片斷。 個人假設是,作到這一點的最簡單方法是getRawX()getRawY()MotionEvent ,而後與佈局保持件的左上角比較這些值。 知道了碎片的大小以後,我能夠肯定選擇了多少碎片。 我知道我可使用getX()getY()MotionEvent ,但做爲一個返回相對位置,使得肯定哪一個被選擇件更困難。 (我知道這不是沒有可能,但彷佛沒必要要地複雜)。 佈局

編輯:根據問題之一,這是我用來嘗試獲取保存容器大小的代碼。 TableLayout是包含全部拼圖的表格。 ui

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());

編輯2:這是我嘗試過的代碼,遵循更多建議的答案。 this

public int[] tableLayoutCorners = new int[2];
(...)

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
            + ", " + corners.bottom);

cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);

完成全部初始化後,便添加了此代碼。 圖像已分爲TableLayout內包含的ImageViews數組(cells []數組)。 Cells [0]是ImageView的左上方,我選擇了cells [4],由於它位於中間的某個位置,而且絕對不該該具備(0,0)的座標。 spa

上面顯示的代碼仍然爲我提供了日誌中的全0,我真的不明白,由於正確顯示了各個拼圖。 (我嘗試使用public int來獲取tableLayoutCorners和默承認見性,二者的結果相同。) 日誌

我不知道這是否有意義,可是ImageView最初沒有給出大小。 當我給ImageView顯示圖像時,View會在初始化期間自動肯定ImageView的大小。 即便該日誌記錄代碼是在給它們一個圖像並自動調整大小以後,這是否也會致使它們的值爲0? 爲了解決這個問題,我添加了代碼tableLayout.requestLayout()如上所示,但這沒有幫助。 code


#1樓

使用全局佈局偵聽器一直對我有效。 它的優勢是,若是更改了佈局(例如,若是將某些內容設置爲View.GONE或添加/刪除了子視圖),則可以從新測量內容。 server

public void onCreate(Bundle savedInstanceState)
{
     super.onCreate(savedInstanceState);

     // inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is
     LinearLayout mainLayout = (LinearLayout ) this.getLayoutInflater().inflate(R.layout.main, null); 

     // set a global layout listener which will be called when the layout pass is completed and the view is drawn
     mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
       new ViewTreeObserver.OnGlobalLayoutListener() {
          public void onGlobalLayout() {
               //Remove the listener before proceeding
               if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    mainLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
               } else {
                    mainLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
               }

               // measure your views here
          }
       }
     );

     setContentView(mainLayout);
 }

#2樓

使用View.getLocationOnScreen()和/或getLocationInWindow()遊戲


#3樓

首先,您必須獲取視圖的localVisible矩形 圖片

例如:

Rect rectf = new Rect();

//For coordinates location relative to the parent
anyView.getLocalVisibleRect(rectf);

//For coordinates location relative to the screen/display
anyView.getGlobalVisibleRect(rectf);

Log.d("WIDTH        :", String.valueOf(rectf.width()));
Log.d("HEIGHT       :", String.valueOf(rectf.height()));
Log.d("left         :", String.valueOf(rectf.left));
Log.d("right        :", String.valueOf(rectf.right));
Log.d("top          :", String.valueOf(rectf.top));
Log.d("bottom       :", String.valueOf(rectf.bottom));

但願這會有所幫助


#4樓

遵循羅曼·蓋伊(Romain Guy)的評論後,這就是我如何解決它。 但願它能對遇到此問題的其餘人有所幫助。

實際上,我確實在嘗試獲取視圖的位置,而後再將其放置在屏幕上,但事實並不是如此。 這些行已在初始化代碼運行後放置,所以我認爲一切準備就緒。 可是,此代碼仍在onCreate()中; 經過試驗Thread.sleep(),我發現直到onCreate()到onResume()的全部執行完成後,佈局才真正肯定下來。 因此確實,代碼是在佈局在屏幕上定位以前試圖運行的。 經過將代碼添加到OnClickListener(或某些其餘偵聽器)中,能夠獲取正確的值,由於只有在佈局完成後才能將其觸發。


建議將如下行做爲社區編輯:

請使用onWindowfocuschanged(boolean hasFocus)


#5樓

使用此代碼查找確切的X和Y座標:

int[] array = new int[2];
ViewForWhichLocationIsToBeFound.getLocationOnScreen(array);
if (AppConstants.DEBUG)
    Log.d(AppConstants.TAG, "array  X = " + array[0] + ", Y = " + array[1]);
ViewWhichToBeMovedOnFoundLocation.setTranslationX(array[0] + 21);
ViewWhichToBeMovedOnFoundLocation.setTranslationY(array[1] - 165);

我添加/減去了一些值來調整個人觀點。 請僅在放大整個視圖後執行這些行。

相關文章
相關標籤/搜索