美文网首页
获取View的宽高

获取View的宽高

作者: 眼角的伤痕 | 来源:发表于2018-09-04 21:39 被阅读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,当获得正确的宽高后,请移除这个观察者,否则回调会多次执行
    方法四代码简单,我比较推荐
    几种方法测试结果:


    各种测量方法测试结果

    相关文章

      网友评论

          本文标题:获取View的宽高

          本文链接:https://www.haomeiwen.com/subject/mmbnwftx.html