简介
view的绘制和Activity的生命周期是没有关系的,如果你在onCreate或者onStart中调用组件的 getWidth/Height, getMeasuredHeight/Width此时获取到的宽和高都是0,因为此时View都没有初始化好,所以获取不到它的宽和高。
获取宽高的方式
onWindowFocusChanged 方法中
onWindowFocusChange是在Activity的焦点发生变化的时候触调,会频繁的调用多次。该方法表明View已经初始化好了可以获取到Width和Height。
- 模板代码
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
int measuredHeight = mTvText.getMeasuredHeight();
int measuredWidth = mTvText.getMeasuredWidth();
Log.d(TAG, "measureHeight = " + measuredHeight);
Log.d(TAG, "measureWidth = " + measuredWidth);
int width = mTvText.getWidth();
int height = mTvText.getHeight();
Log.d(TAG, "width = " + width);
Log.d(TAG, "height = " + height);
}
}
view.post(Runnable)
组件通过调用post方法发送一个Runnbale到消息队列的末尾,当Looper执行到这个Runnable,View已经初始化好了,可以获取到宽和高了
- 模板代码
@Override
protected void onStart() {
super.onStart();
mTvText.post(new Runnable() {
@Override
public void run() {
int onCreateHeight = mTvText.getHeight();
int onCreateWidth = mTvText.getWidth();
int measuredWidth = mTvText.getMeasuredWidth();
int measuredHeight = mTvText.getMeasuredHeight();
Log.d(TAG, "onCreate: " + onCreateHeight);
Log.d(TAG, "onCreate: " + onCreateWidth);
Log.d(TAG, "onCreate: " + measuredWidth);
Log.d(TAG, "onCreate: " + measuredHeight);
}
});
}
ViewTreeObservable
在ViewTreeObservable回调方法中可以获取到View的宽和高,比如使用了OnGlobalLayoutListener这个接口,当View树的状态发生改变获取View树内部的View的可见性发生改变的时候,接口中的onGlobalListener方法将被回调。这是获取View宽高的一个好的时机。
- 模板代码
@Override
protected void onStart() {
super.onStart();
// 当View树的状态发生改变或者View树内部的View的可见性发生改变时,onGlobalLayout方法将被回调。
ViewTreeObserver viewTreeObserver = mTvText.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mTvText.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int measuredHeight = mTvText.getMeasuredHeight();
int measuredWidth = mTvText.getMeasuredWidth();
Log.d(TAG, "onGlobalLayout: " + measuredHeight);
Log.d(TAG, "onGlobalLayout: " + measuredWidth);
}
});
}