2017-03-08 17 views
0

新しいViewGroupを作成しています。新しいビューにはいくつかの円が描かれます。ビューには5つの初期円があるはずですので、ビューの幅に均等にそれらを広げ、そのビュー(中心(x、y)の位置)を追跡して、ビューが無効にされました。サイズに基づいてカスタムレイアウトを描画する必要がある場合

これは私のonMeasure:私はこれらの円を追加する必要があるとき

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    int desiredWidth = getPaddingLeft() + getPaddingRight() + PREFERED_SIZE; 
    int desiredHeight = getPaddingTop() + getPaddingBottom() + PREFERED_SIZE; 

    actualWidth = resolveSizeAndState(desiredWidth,widthMeasureSpec,0); 
    actualHeight = resolveSizeAndState(desiredHeight,heightMeasureSpec,0); 
    setMeasuredDimension(actualWidth, actualHeight); 
} 

私はよく分からないことです。 onMeasureは何度も呼び出すことができ、異なる幅と高さの値を取得するので、最初の円の(x、y)を計算する必要があるかどうかわかりません。onMeasure? の先頭に?

答えて

0

ちょうどドキュメントで確認してください。そこ測定部の3つのコールバックをしていると私はあなたが最後の上で行うことができますね。このビューとそのすべての子のサイズ要件を決定するために呼び出されhttps://developer.android.com/reference/android/view/View.html

  • onMeasure(int, int)
  • onLayout(boolean, int, int, int, int)このビューでは、すべての子にサイズと位置を割り当てる必要があるときに呼び出されます。
  • onSizeChanged(int, int, int, int)このビューのサイズが変更されたときに呼び出されます。

だから、計算にはonSizeChangedが最適だと思います。

0

あなたは、レイアウトの変更を追跡するためにView.OnLayoutChangeListenerを使用することができます。

public class CustomView extends View implements View.OnLayoutChangeListener { 

    private int height; 
    private int width; 

    public CustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     // add the layout listener 
     addOnLayoutChangeListener(this); 
    } 

    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     height = getHeight(); 
     width = getWidth(); 
    } 

} 
+0

onMeasureとほぼ同じようですか? –

+0

正確には、 'onMeasure'は' onLayoutChange'よりも何度も呼び出されます。 'onMeasure'は親ビューがレイアウトを計算する必要があるたびに呼び出され、' onLayoutChange'は特定のビューのレイアウトが変更されたときに呼び出されます。 –

関連する問題