42

Android でカスタム ビューとレイアウトを作成する例をたくさん見てきました。私が彼らから学んだことは、メジャー (Android 開発者のサイトで述べたように) メソッドはonMeasure()でありwidthMeasureSpecheightMeasureSpecパラメーターとして と を持つということです。

  1. これらのパラメータの実際の意味は何ですか?
  2. それらの初期値は何ですか?
  3. 作成しているカスタム ビューがアクティビティの親ビューである場合、それらはどのような値で呼び出されますか?

私はこれらの質問について本当に非常に混乱しています。

4

2 に答える 2

75

widthMeasureSpecheightMeasureSpecは複合変数です。つまり、それらは単純な古い int ですが、実際には 2 つの別個のデータが含まれています。

これらの変数に格納されるデータの最初の部分は、指定された次元で使用可能なスペース (ピクセル単位) です。

この便利な方法を使用して、このデータを抽出できます。

int widthPixels = View.MeasureSpec.getSize( widthMeasureSpec );

2 番目のデータは測定モードで、int の上位ビットに格納され、次の値のいずれかになります。

View.MeasureSpec.UNSPECIFIED
View.MeasureSpec.AT_MOST
View.MeasureSpec.EXACTLY

この便利な方法で値を抽出できます。

int widthMode = View.MeasureSpec.getMode( widthMeasureSpec );

いくつかのロジックを実行し、これらのいずれかまたは両方を変更してから、最後の簡易メソッドを使用して新しい measureSpec を作成できます。

int newWidthSpec = View.MeasureSpec.makeMeasureSpec( widthPixels, widthMode  );

そしてそれをあなたの子供たちに伝えてください。super.onMeasure( widthMeasureSpec, heightMeasureSpec );

MeasureSpec パターンではonMeasure()、ビューとその子が占有できる最大許容スペースを渡す目的を果たします。また、子ビューにいくつかの追加の制約を設定する方法としてスペック モードを使用し、使用可能なスペースの使用方法を子ビューに通知します。

これがどのように使用されるかの良い例は、パディングです。ViewGroups は、利用可能な幅と高さを取得し、それらのパディングを差し引いてから、新しい meassureSpec を作成して、子にわずかに小さい領域を渡します。

于 2014-01-27T20:56:46.310 に答える