2012-03-02 9 views
1

イメージタイル(そのスケール)の位置を決めるためにいくつかのFrameLayoutsを使用するタイル型のパンnズームコンポーネントがあります。スケール)とコントロール(移動もスケーリングもしません)。それはうまく動作します。Android - ビューを配置するためにビューのサイズを取得する

マーカは、topMarginとleftMarginを持つFrameLayoutに配置されます。ここまでは順調ですね。

マーカーをタッチすると、触れたマーカと同じ位置にある小さなポップアップを開く必要があります()が、ポップアップのサイズでオフセットされています。つまり、ポップアップが幅100ピクセル、高さ50ピクセルで、タッチされたマーカーが800 xと1100 yの場合、ポップアップは750 x(ポップアップの幅からポップアップの幅の半分を差し引いた位置)と1050 y (マーカの位置からポップアップの高さを差し引いた位置)。エフェクトはツールチップのようなもので、マーカーなどの小さなポイントが表示されます。

ポップアップのサイズは、表示するテキストに基づいて柔軟に計算する必要があります。

明らかに、レイアウトが起こるまで、寸法は利用できません。これらのディメンションを取得し、それに応じて対応する最良の方法は何ですか?

(RelativeLayoutはオプションではないことを言及する必要があります)

TYIA。

/EDIT 私はonMeasureとonLayoutで子供の寸法を得ることができますが、これらのハンドラの1つに新しいレイアウトを適用すると無限ループが作成されます。最初のパスをキャッチするフラグを設定しましたうまくいかない。私は更新された質問は "私は情報を得ることができ、どのように反応し、それを配置すべきか知っているからでしょうか?

答えて

1

答えは、View自体ではなく、含むViewGroupのonLayoutを上書きして位置を管理することです。

例えば、

@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); 
     } 
    } 
} 

(上記の例では、特にテストされていないが、私は前提をテストしてみたし、それが動作することに注意してください)

関連する問題