AndroidSDKのgetWidth / Height()とgetMeasuredWidth / Height()の違いは何ですか?


88

Androidのドキュメントは言うビュー、のための2つのサイズがあることが測定された寸法図面寸法。測定された寸法は、測定パスonMeasureメソッド)で計算された寸法ですが、図面の寸法は画面上の実際のサイズです。特に、ドキュメントには次のように書かれています。

これらの値は、測定された幅および高さと異なる場合がありますが、異なる場合はありません。

だから、私の質問は、図面の寸法が測定された寸法と異なるのはなぜですか?onMeasure(int、int)メソッドがレイアウト要件(パラメーターwidthMeasureSpecおよびheightMeasureSpecとして指定を尊重する場合、SDKはビューの描画サイズを変える必要があるとどのように判断できますか?

さらに、Androidソースコードのどこで、測定された幅/高さを使用して、描画の幅/高さを計算しますか?ビューのソースコードを調べようとしましたが、measuredWidth / Heightを使用して最終的な幅/高さを計算する方法がわかりません。パディングと関係があるのか​​もしれませんが、よくわかりません。


ビューにスクロールを追加した場合、これらの対策は異なる可能性があると思います。
ユーリー2011

たぶん、しかし私はカスタムViewGroupを開発しました、そしてこれは私のコードで起こっています。この動作が発生するまで、スクロールを扱っていません。ですから、これにはスクロール以上のものが含まれるべきだと思います。
lgfischer 2011

確認します。カスタムViewGroupも開発して、特定のアスペクト比を強制します。測定された幅と高さ(提案された値以下)を強制しましたが、結果として実際の幅と高さは変更されませんでした(測定されたものではありません)。巻物とは関係ありません。実際の幅と高さを強制する方法を本当に見つけることができません。
ARLabs 2016年

回答:


96

名前が示すように、measuredWidth / heightは、測定およびレイアウト段階で使用されます。

例を挙げましょう、

ウィジェットはそれ自体を測定するように求められます。ウィジェットは、200px x200pxになりたいと言っています。これは測定された幅/高さです。

レイアウトフェーズ中、つまりonLayoutメソッド内。このメソッドは、子のmeasuredWidth / heightを使用するか、ビューのlayoutメソッドを呼び出して新しい幅/高さを割り当てることができます。

onLayoutメソッドがchildview.layout(0,0,150,150)を呼び出すとすると、ビューの幅/高さは測定された幅/高さとは異なります。

onLayoutメソッドの外部でmeasuredWidth / heightを使用しないことをお勧めします。

要約する 。

  1. onMeasure->測定幅/測定高さを設定します
  2. onLayout->ウィジェットの幅/高さを設定します。

さらに
public void View.layout(int l, int t, int r, int b)
、位置とサイズの割り当てが行われる場所のようです。


つまり、ビューの「実際の」寸法を取得するには、常にgetWidth / getHeightを使用する必要があります。
suitianshi

1
はい。ただし、独自のレイアウトを行う場合は、幅ではなく測定幅を使用する必要があります。
Prakash Nadar

では、onMeasure()内に次元を設定する目的は何ですか?つまり、レイアウトパスは最後のパスであり、ビューの最終的な寸法を設定します。測定された寸法に関係なく、可能性があります
edoardotognoni 2015年

@edoardotognoniビューに正しいサイズと位置を与えるために、レイアウト(LinearLayout、RelativeLayout、またはカスタムレイアウト)に依存します。
Prakash Nadar 2015年

ビューに「これらの寸法が欲しい」と表示されているとしましょう。レイアウトには「これらの寸法があります」と書かれていますが。正しいですか?
edoardotognoni 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.