因為經常在Activity中的onCreate中要擷取一些View的寬高資訊,以往都是利用ViewTreeObserver來擷取,今天看到網上一個有意思的小Demo,作者擷取的寬高的方法以前從未聽說過,跟大家分享一下。
一:ViewTreeObserver
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
h = view.getHeight();
w = view.getWidth();
//因為此方法會進來多次,是以為了避免不必要的浪費,擷取完成後移除監聽就可以
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
二:利用View.post方法
view.post(new Runnable() {
@Override
public void run() {
h = view.getHeight();
w = view.getWidth();
}
});
至于為什麼這樣做可以,我也不是很清楚,試着找了找源碼,但是太複雜了,是以放棄了。。。。
下面是作者的解釋:
UI事件隊列會按順序處理事件。在setContentView()被調用後
事件隊列中會包含一個要求重新layout的message
是以任何你post到隊列中的東西都會在Layout發生變化後執行
那麼這樣事件的執行順序就跟OnGlobalLayoutListener的onGlobalLayout一樣了,是以可以獲得正确的結果。