Skip to content

获取一个未展示的 view 的宽高的四种方法

安卓小煜 edited this page Oct 15, 2019 · 1 revision

第一种:Activity/View 的 onWindowFocusChanged(boolean hasFocus) 方法

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // 注意,这里可能多次调用,因此需要一个标志位控制
    if (hasFocus && notInit) {
        mWidth = view.getMeasuredWidth();
        mHeight = view.getMeasuredHeight();
    }
}

第二种:view.post(Runnable action)

view.post(new Runnable() {
    @Override
    public void run() {
        mWidth = view.getMeasuredWidth();
        mHeight = view.getMeasuredHeight();
    }
});

第三种:ViewTreeObserver

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        mWidth = view.getMeasuredWidth();
        mHeight = view.getMeasuredHeight();
    }
});

第四种:view.measure(int widthMeasureSpec, int heightMeasureSpec)

分三种情况。

对于 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();