カスタムビューのMeasureSpecクラスの解説

測定用クラスはカスタムビューでViewの大きさを確定するためにonMeasureメソッドをオーバーライドする必要があるAndroid上でViewのサイズを測定するユーティリティクラスです。

MeasureSpecクラスには32ビットのint値が含まれており、そのうち上位2ビットが測定モードを表し(MeasureSpecのモードはUNSPECIFIED、EXACTLY、AT_MOSTの3種類)、下位30ビットがサイズを表しています。

MeasureSpecクラスはViewの測定プロセスにおいて主に次の2つの役割を果たします。

  1. 親Viewから子Viewへ渡されるMeasureSpecを解析し、測定モードとサイズを取得します。
  2. 測定モードと子のビューの希望するサイズに基づき、子のビューの測定サイズを計算します。

MeasureSpecの解析方法には2種類あり、getMode(int measureSpec)とgetSize(int measureSpec)があります。前者は測定モードを取得するために使用され、後者はサイズを取得するために使用されます。

  1. getMode()メソッド:

getModeメソッドはMeasureSpec内の測定モードを取得するもので、測定モードは3種類あります。

  1. 未指定(未指定モード):親容器が子ビューに対して何の制約も設けず、子ビューは任意のサイズになる
  2. 親ビューが子ビューに正確なサイズを指定し、子ビューの大きさは MeasurementSpec のサイズと一致する必要がある。
  3. AT_MOST(上限モード):親ビューが子ビューの上限サイズを指定し、子ビューの大きさはMeasureSpecのサイズ値を超えることができない。
  1. サイズ取得メソッド:

`getSize` メソッド は `MeasureSpec` 内のサイズを取得します。サイズは具体的な数値で、View の望ましいサイズを表します。

一般的にカスタムビューでは、測定モードとサイズに応じたビューの測定サイズを計算します。測定サイズを計算する方法には、resolveSize(int size, int measureSpec) と resolveSizeAndState(int size, int measureSpec, int childMeasuredState) の 2 つがあります。resolveSize メソッドは測定サイズを計算するためだけに使用され、resolveSizeAndState メソッドは測定サイズの計算に加えて、子のビューの状態を保持できます。

  1. resolveSize メソッド

resolveSizeメソッドは、計測モードと寸法サイズに基づいて、View の計測サイズを計算します。計算のルールは次のとおりです。

  1. 測定モードがEXACTLYであれば、そのまま寸法を返します。
  2. 測定モードがAT_MOSTの時は、サイズサイズとMeasureSpecのサイズサイズの小さい方を返す
  3. 測定モードが UNSPECIFIED の場合は、1次元の大きさを返します。
  1. resolveSizeAndStateメソッド

resolveSizeAndStateメソッドの役割はresolveSizeメソッドと似ていますが、サブビューの状態が保存できるという点だけが異なります。サブビューの状態は、測定状態(サブビューの測定状態にはMEASURED_STATE_TOO_SMALL、MEASURED_STATE_MASK、MEASURED_STATE_SHIFTの3種類あります)を表す上位2ビットと、サイズを表す下位30ビットの32ビットのint値です。

カスタムビューでは、resolveSizeAndStateメソッドを使用して測定サイズを計算し、子ビューの状態を保持することが一般的です。

MeasureSpecクラスは、ビューのサイズを測定するためのユーティリティクラスです。MeasureSpecを解析することで、測定モードと測定サイズを取得し、測定モードと測定サイズに基づいてビューの測定サイズを計算します。カスタムビュー内で、MeasureSpecクラスを使用してビューの測定プロセスを完了できます。

bannerAds