View 的 getWidth()和 getMeasuredWidth()的区别
getMeasuredWidth():先看一下API是这么说的:
The width of this view as measured in the most recent call to measure(). This should be used during measurement and layout calculations only.
此视图的宽度在最近调用Measure()时测量。这只能在测量和布局计算期间使用。
- getWidth(): View在设定好布局后整个View的宽度。
- getMeasuredWidth(): 对View上的内容进行测量后得到的View内容占据的宽度,前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure中的参数的值你自己可以定义),否则你得到的结果和getWidth()得到的结果是一样的。
如何在 onCreate 中拿到 View 的宽度和高度?
在开发过程中经常需要获取到View的宽和高,可以通过View.getWidth()和View.getHeight()来得到宽高。然而在onCreate方法中直接调用上面两个方法得到的值是0!
这是为什么呢?
因为View绘制是通过两个遍历来完成的,一个measure过程,一个layout过程。只有经过“测量”和“布局”之后,View才能正确地完成绘制。而这一切是发生在onCreate方法之后的。所以在onCreate中直接使用View.getWidth()和View.getHeight()是无法得到正确的值的。
解决方案
- View.post()
该方法传递一个Runnable参数,然后将其添加到消息队列中,最后在UI线程中执行。
view.post(new Runnable() {
@Override
public void run() {
//进行测量
}
});
- OnGlobalLayoutListener
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// //现在布局全部完成,可以获取到任何View组件的宽度、高度、左边、右边等信息
// ,会调用过多次,可以加标识处理
}
});
网友评论