获取View的宽高

2018-09-04  本文已影响8人  眼角的伤痕

在onCreate中获取View的宽高,返回值都是0,因为在onCreate中,View还没绘制,所以返回值为0,一般用的比较多的获取View宽高的方法有以下几种:

1、直接测量

通过MeasureSpec直接测量,代码如下:

 mTextView = findViewById(R.id.textview);
        int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        mTextView.measure(w, h);
        int width = mTextView.getMeasuredWidth();
        int height = mTextView.getMeasuredHeight();

不过该方法有一个缺陷:测量的View宽高必须设置为wrap_content,否则会获得固定值。

2、通过ViewTreeObserver.addOnPreDrawListener

通过对ViewTree进行监听,获取View的宽高,代码如下:

   ViewTreeObserver viewTreeObserver = mTextView.getViewTreeObserver();
        viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
//需要一出监听,否则会调用多次
//                viewTreeObserver.removeOnPreDrawListener(this);
                int height = mTextView.getMeasuredHeight();
                int width = mTextView.getMeasuredWidth();
                Log.i("kingiyu", "MainActivity-->-->onPreDraw-->" + width + "->height:->" + height);
                return true;
            }
        });
3、通过ViewTreeObserver.addOnGlobalLayoutListener

该方法和方法2差不多,只是执行顺序比方法二要前,代码如下:

  ViewTreeObserver viewTreeObserver2 = mTextView.getViewTreeObserver();
        viewTreeObserver2.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
//需要一出监听,否则会调用多次
//                viewTreeObserver2.removeGlobalOnLayoutListener(this);
                Log.i("kingiyu", "MainActivity-->-->onGlobalLayout-->" + mTextView.getWidth() + "->height->" + mTextView.getHeight());
            }
        });
4、通过onWindowFocusChanged

onWindowFocusChanged是Activity真正可见的生命周期,执行到onWindowFocusChanged,控件才能和用户进行交互,因此在onWindowFocusChanged时控件已经绘制完成,可以通过View.getHeight和View.getWidth获取控件位置和宽高。代码如下:

  public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        int height = mTextView.getHeight();
        int width = mTextView.getWidth();
        Log.i("kingiyu", "MainActivity-->-->onWindowFocusChanged-->" + width + "->height:->" + height);
    }

总结

方法一通过MeasureSpec直接测量需要View设置为wrap_content
方法二和方法三通过ViewTreeObserver监听ViewTree,当获得正确的宽高后,请移除这个观察者,否则回调会多次执行
方法四代码简单,我比较推荐
几种方法测试结果:


各种测量方法测试结果
上一篇 下一篇

猜你喜欢

热点阅读