-
Notifications
You must be signed in to change notification settings - Fork 0
获取一个未展示的 view 的宽高的四种方法
安卓小煜 edited this page Oct 15, 2019
·
1 revision
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
// 注意,这里可能多次调用,因此需要一个标志位控制
if (hasFocus && notInit) {
mWidth = view.getMeasuredWidth();
mHeight = view.getMeasuredHeight();
}
}
view.post(new Runnable() {
@Override
public void run() {
mWidth = view.getMeasuredWidth();
mHeight = view.getMeasuredHeight();
}
});
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
mWidth = view.getMeasuredWidth();
mHeight = view.getMeasuredHeight();
}
});
分三种情况。
对于 match_parent 无法使用该方式。
对于固定大小,比如 50dp/px,可以直接拿到数值。也可以按照下面方式获取:
// get 50px
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(50, View.MeasureSpec.EXACTLY);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(50, View.MeasureSpec.EXACTLY);
view.measure(widthMeasureSpec, heightMeasureSpec);
mWidth = view.getMeasuredWidth();
mHeight = view.getMeasuredHeight();
对于 warp_content,示例获取方式如下:
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec((1<<30)-1, View.MeasureSpec.AT_MOST);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec((1<<30)-1, View.MeasureSpec.AT_MOST);
view.measure(widthMeasureSpec, heightMeasureSpec);
mWidth = view.getMeasuredWidth();
mHeight = view.getMeasuredHeight();