0

私は現在、このUI構造を持っています:

Activity (ACT)
  LinearLayout (LL)
    HorizontalScrollView (HSV)
      RelativeLayout (RL)

RL のレイアウト パラメータを設定すると、手遅れになるまで適用されません。

var TotalWidth = GetNewWidth() // eg returns 1000...

var lp = this.LayoutRoot.LayoutParameters;
lp.Width = TotalWidth;
this.LayoutRoot.LayoutParameters = lp;

// this.LayoutRoot.LayoutParameters.Width == 1000
// this.LayoutRoot.Width == 0

this.LayoutRoot.RequestLayout();
this.LayoutRoot.ForceLayout();
this.RequestLayout();    
this.ForceLayout();

// this.LayoutRoot.LayoutParameters.Width == 1000
// this.LayoutRoot.Width == 0

幅を使用していなかった場合、これは問題ではありませんが、私は :) 私はこれをしたいです:

this.ScrollTo(500, 0);

HSV の子の合計幅が現在 0 であるため、これは効果がありません。

しかし、私がこれを行うと:

this.PostDelayed(() => this.ScrollTo((int) percent, 0), 500);

500ミリ秒の遅延後に機能します。

HSV は、そのコンテンツ自体を管理する派生クラスです。幅を設定するために使用する空の RL であり、画像を描画するための巨大な領域を確保できます。大規模なスクロール キャンバスのようなものです。また、私がやろうとしているのは、HSV の OnSizeChanged オーバーライドされたメンバーです。コントロールのサイズを変更すると、コントロールが同じ位置にスクロールされるようにしたい。幅は高さに依存します (アスペクト比を維持します)

4

1 に答える 1

1

レイアウトが再計算されるまで待つ必要があります。レイアウトを呼び出すとforceLayout、すぐには行われず、UI スレッドのキューに追加されるだけです。onLayoutまたはonSizeChanged、新しい位置とサイズが割り当てられるとすぐに、関連するすべてのビューに対して呼び出されます。それについてあなたが本当にできることは何もありません。

于 2012-07-05T08:56:18.797 に答える