在很多时候,我们在绘制视图的时候,比如添加控件的时候,需要设置宽高或者为某个控件添加xy的时候,以及动态添加控件的时候,我们常常需要依赖于别的控件。比如,我要显示一个popupwindow,然后需要显示的位置是在某一个控件的下方,有时候我们就需要用到别的控件的具体位置,但是在初始化的时候,我们获取到的控件的具体位置一般都是0。比如获取一些控件的宽高,获取到的是0,因为视图还没有获取完成。当视图绘制完成之后,再去获取宽高,就能得到正常的宽高。这个时候就需要ViewTreeObserver。ViewTreeObserver viewTreeObserver=titleView.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Log.d("20201202", "titleView的高度:" +titleView.getHeight());
}
});
这样的话,每次titleView绘制完成之后,都会调用这个方法。这个时候就可以获取到这个控件的正常的宽高了。如果只是想获取一次,那么就需要在第一次获取成功之后,在onGlobalLayout() 里面加入titleView.getViewTreeObserver().removeOnGlobalLayoutListener(this);不再监听这个视图的绘制。
网友评论