在Android中,有时需要对控件进行测量,得到的控件宽度和高度可以用来做一些计算。在需要自适应屏幕的情况下,这种计算就显得特别重要。另一方面,由于需求的原因,希望一进入界面后,就能得到控件的宽度和高度。
但是在onCreate()方法中是得不到控件的宽高的,不论是getWidth()还是getMeasuredWidth(),返回的都是0。
原因是因为当OnCreate函数发生时,只是提供了数据初始化的机会,此时还没有正式绘制图形。而绘制图形在OnDraw()中进行。容易想到的办法是:希望能在程序刚刚测量好某个指定控件进行绘制前,拿到它的宽度和高度立刻进行计算或数据初始化。这就需要有一个方法来监听到这个事件的发生。Android提供了这样的机制,利用View类中的getViewTreeObserver()方法,可以获取到指定View的ViewTreeObserver对象,在绘制控件前的一刹那进行回调,这样速度上又不耽误,得到的数据由是准确的。
通过ViewTreeObserver类
http://developer.android.com/reference/android/view/ViewTreeObserver.html
ViewTreeObserver mViewTreeObserve=view.getViewTreeObserver(); mViewTreeObserve.addOnPreDrawListener(new OnPreDrawListener(){ public boolean onPreDraw(){ if(!hasMeasured){ int width=view.getMeasuredWidth();//or int width=view.getWidth();
int height=view.getMeasuredHeight();//or int height=view.getHeight(); hasMeasured=true; } return true; } }); }
这个方法中需要有hasMeasured标记,防止方法被多次调用。getWidth()和getMeasuredWidth()方法返回像素单位,并且值相同。
请注意,getWidth()和getMeasuredWidth()方法是有区别的。