您的位置:首页 > 其它

View 的宽高的获取

2015-12-16 10:08 281 查看

View的measure过程和Activity的生命周期是异步执行的所以一般在onResume中获取的宽高都为0

下面有四个方法解决这个问题

1. Activity/View#onWindowFousChanged

@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
int with=view.getMeasureWidth();
int height=view.getMeasureHeight();
}
}


当Activity的窗口得到焦点和失去焦点时会被调用一次

.

2. view.post(runnable)

通过post可以将一个runnable投递到消息队列的尾部,然后等待Looper调用此runnable的时候,View也已经初始化好了。

view.post(new Runnable() {
@Override
public void run() {
int with=view.getMeasureWidth();
int height=view.getMeasureHeight();
}
});


.

3. ViewTreeObserver

当View树的状态发生改变或者View树内部的View的可见性发现改变时,onGlobalLayout方法将被回调,不过它会被回调多次。

所以第一次回调完便移除监听。

ViewTreeObserver observer= view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int with=view.getMeasureWidth();
int height=view.getMeasureHeight();
}
});


.

4. view.measure(int widthMeasureSepc,int heightMeasureSpec)

通过手动对View进行measure来得到View的宽高。这个方法执行完,View的宽高是可以获取的。

view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

view.getMeasuredWidth();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: