widthMeasureSpecとheightMeasureSpecは複合変数です。つまり、それらは単純な古い 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 を作成して、子にわずかに小さい領域を渡します。