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的宽高;
解决这一问题有四种方案:
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的宽高;
相关文章推荐
- android 开发中获取View视图的宽和高的几种方法
- Android 开发中获取View视图的宽和高的几种方法
- android 开发中获取View视图的宽和高的几种方法
- android获取view宽高的几种方法
- android获取view宽高的几种方法 - ysl_longer
- Android获取View坐标的几种方法
- Android 获取View高度的几种方法
- Android--获取View的宽高的几种方法
- android获取view宽高的几种方法,解决获取高宽为0问题
- 【Android 开发】:TextView的几种使用方法
- 【Android 非人为操作的UI更新】在onCreate()和onResume()等方法中的更新UI操作方法及获取View的相关消息
- [转]几种获取Android系统内存使用状况的方法
- Android获取APK包名的几种方法
- inflate获取view 的几种方法
- android获取包名的几种方法
- [Android] 获取WebView的页面标题(Title)-----WebChromeClient.onReceivedTitle()方法的重写
- android中改变view位置的几种方法
- Android获取webView快照与屏幕截屏的方法
- android自定义View构造方法以及获取自定义属性详解
- android获取context的几种方法