我正在嘗試獲取視圖左上角的絕對屏幕像素座標。 可是,我能夠找到的全部方法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
使用全局佈局偵聽器一直對我有效。 它的優勢是,若是更改了佈局(例如,若是將某些內容設置爲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); }
使用View.getLocationOnScreen()
和/或getLocationInWindow()
。 遊戲
首先,您必須獲取視圖的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));
但願這會有所幫助
遵循羅曼·蓋伊(Romain Guy)的評論後,這就是我如何解決它。 但願它能對遇到此問題的其餘人有所幫助。
實際上,我確實在嘗試獲取視圖的位置,而後再將其放置在屏幕上,但事實並不是如此。 這些行已在初始化代碼運行後放置,所以我認爲一切準備就緒。 可是,此代碼仍在onCreate()中; 經過試驗Thread.sleep(),我發現直到onCreate()到onResume()的全部執行完成後,佈局才真正肯定下來。 因此確實,代碼是在佈局在屏幕上定位以前試圖運行的。 經過將代碼添加到OnClickListener(或某些其餘偵聽器)中,能夠獲取正確的值,由於只有在佈局完成後才能將其觸發。
建議將如下行做爲社區編輯:
請使用onWindowfocuschanged(boolean hasFocus)
使用此代碼查找確切的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);
我添加/減去了一些值來調整個人觀點。 請僅在放大整個視圖後執行這些行。