天天看點

兩種方法擷取View寬高資訊

因為經常在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一樣了,是以可以獲得正确的結果。