在OnCreate中获取View的宽高/ViewTreeObserver

大家都知道的是在Activity的onCreate方法中获取到的View的宽高都是0,在onResume中也是0,那么在我们有时候需要在View初始化的时候根据View的宽高来做一些调整的时候怎么办呢。

有一个比较好的方法就是使用 ViewTreeObserver Android官方文档

这是一个针对View的观察者,可以注册进去自己需要的监听器来做一些事情,我这里的需求是要根据ImageView的实际大小与图片大小做比较从来改变 ScaleType值,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ViewTreeObserver observer = mImage.getViewTreeObserver();
observer.addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
int viewW = mImage.getMeasuredWidth();
int viewH = mImage.getMeasuredHeight();
int imgW = mAdBitmap.getWidth();
int imgH = mAdBitmap.getHeight();
LogUtils.d(TAG, "viewW:"+viewW+";viewH:"+viewH+";imgW:"+imgW+";imgH:"+imgH);
if(imgW <= viewW && imgH<=viewH) {
mImage.setScaleType(ScaleType.CENTER_CROP);
LogUtils.d(TAG, "----------set Ad view ScaleType = CENTER_CROP-------------");
}else {
mImage.setScaleType(ScaleType.CENTER_INSIDE);
LogUtils.d(TAG, "----------set Ad view ScaleType = CENTER_INSIDE-------------");
}
return true;
}
});

OnPreDrawListener 也就是在View的Draw之前会被调用到,用来做一些事情,同时需要留意的是onPreDraw的返回值。

ViewTreeObserver其实还有一些其他的监听器。具体就不详细介绍了,需要的可以去参考官方文档

参考文章:http://www.2cto.com/kf/201208/146660.html