您的位置:首页 > 移动开发 > Android开发

Android中获取view的宽高的几种方法

2017-09-17 09:13 316 查看
很多自定义的view中需要在某个方法中获取一个View的宽高之后再进行相应的操作,但activity中的onCreate、onStart、onResume的方法中是无法正确的获取到某个想要获取View的宽高信息的。这是因为View的measure过程和activity的生命周期方法不是同步执行的,因此无法保证activity执行了onCreate、onStart、onResume时View已经测量完毕,如没测量完毕则获取到的宽高为0。



解决这一问题有四种方案:

1.Activity/View#onWindowFocusChanged:

onWindowFocusChanged这个方法的含义是view已经初始化完毕了,宽高已经准备好了。这时候去获取宽高是伪问题的。onWindowFocusChanged会调用多次,当Activity的窗口得到焦点和失去焦点时均会被调用一次。

public void onWindowFocusChanged(boolean){
super.onWidowFocusChanged(hasFocus);
if(hasFoucs){
int width=view.getMeasureWidth();
int height=view.getMeasureHeight();
}}

2.view.post(runnable):

通过post可以将一个runnable投递到消息队列的尾部,然后等待Looper调用此runnable的时候,View也已经初始化好了:
protected void onStart(){
super.onStart();
view.post(new Runnable(){
@Override
public void run(){
int width=view.getMeasureWidth();
int height=view.getMeasureHeight();
}
});
}

3.ViewTreeObserver:

使用ViewTreeObserver的众多回调可以完成这个功能,如使用OnGlobaLayoutListener这个接口,当View树的状态发生变化或者View树内部的View的可见性发生改变时,onGlobalLayout方法会被调用,因此这时可以获取到View的宽高的信息。
protect void onStart(){
super.onStart();
ViewTreeObserver observer=view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@supperssWarnings("deprecation")
@Override
public void onGlobalLayout(){
view.getViewTreeObserver().removeGlobalLayoutListener(this);
int width=view.getMeasureWidth();
int height=view.getMeasureHeight();
}
});
}

4.view.measure(int widthMeasureSpec,int heigtMeasureSpec):

通过手动对View进行measure来得到View的宽高;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息