2012-03-02 67 views
1

我有一個平鋪的pan-n-zoom組件,它使用多個FrameLayouts來定位圖像拼貼(縮放),標記(移動但不規模)和控制(既不移動也不縮放)。它工作正常。Android - 獲取視圖的尺寸以便定位它

標記位於帶有topMargin和leftMargin的FrameLayout中。到現在爲止還挺好。

當觸摸某個標記時,我需要打開一個小彈出窗口,其位置與被觸摸的標記相同,但被彈出窗口的尺寸所抵消。也就是說,如果彈出窗口的寬度爲100像素,高度爲50像素,觸摸的標記爲800 x和1100 y,則彈出窗口應該位於750 x(標記的位置減去彈出窗口寬度的一半)和1050 y (標記的位置減去彈出的全部高度)。效果就像一個工具提示 - 在標記處有點小結點等。

彈出的尺寸是基於要顯示的文本而靈活的,並且需要進行計算。

顯然這些尺寸直到佈局發生後纔可用。獲得這些尺寸並作出相應反應的最佳方法是什麼?

(應該提到RelativeLayout不是一個選項)

TYIA。

/編輯 看起來像我可以在onMeasure和onLayout中獲得兒童的維度,但在其中一個處理程序中重新應用新佈局會創建一個無限循環 - 設置一個標誌以抓住第一遍不行。我想更新後的問題是「現在我知道我可以在哪裏獲得信息,我應該如何反應並定位?」

回答

1

答案是通過覆蓋包含ViewGroup的onLayout來管理定位,而不是View本身。

例如,

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    int count = getChildCount(); 
    for (int i = 0; i < count; i++) { 
     View child = getChildAt(i); 
     if (child.getVisibility() != GONE) { 
      MyCustomLayout.LayoutParams lp = (MyCustomLayout.LayoutParams) child.getLayoutParams(); 
      int w = child.getMeasuredWidth(); 
      int h = child.getMeasuredHeight(); 
      int x = lp.left - (int) (w/2f); 
      int y = lp.top - h; 
      child.layout(x, y, x + w, y + h); 
     } 
    } 
} 

(請注意,上面的例子特別是未經測試,但我已經測試的前提和它的作品)