因为经常在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一样了,所以可以获得正确的结果。