安卓 onCreate 方法获取 view 宽高的方法

2017-11-25  本文已影响17人  ToNext

我们在开发中经常会遇到在界面中比如 activity 使用到控件的 width 或者 height,大家也都知道在 onCreate() 中去 getWidth() 或者是 getMeasuredWidth() 拿到的结果都是 0,这是因为我们的 activity 的创建和 view 绘制不是同步的,下面我总结了一些方法来获取 view 的宽度和高度的方法:

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            int measuredHeight = view.getMeasuredHeight();
        }
    }
        view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
        });
        view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                return false;
            }
        });

match_parent
无法 measure 出具体的宽高。因为这个情况下,我们无法得到父容器的剩余空间,无法知道 parentSize ,所以不可能测量到 view 的大小,这个情况可以用上述其他方式来获取。

具体的数值(dp/px)

int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
        int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(200, View.MeasureSpec.EXACTLY);
        view.measure(widthMeasureSpec, heightMeasureSpec);
 

wrap_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);

注意 (1 << 30) - 1,通过分析 MeasureSpec 的实现我们知道,View 的尺寸使用30位二进制表示,也就是说最大是30个1,即(2^30-1),也就是 (1 << 30) - 1,在最大化模式下,我们用 View 理论上能支持的最大值去构造 MeasureSpec 是合适的。

上一篇 下一篇

猜你喜欢

热点阅读