美文网首页
获取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相关知识

    获取View的宽高 (1)Activity/View onWindowFocusChanged (2)view.p...

  • 自定义View(待整理)

    1.坐标系 View获取自身宽高 getHeight():获取View自身高度 getWidth():获取View...

  • 自定义View获取宽高

    自定义View的时候经常少不了获取View的宽高信息,当然不一定是自定义View的时候才会需要获取宽高信息,其他情...

  • Android App 知识点整理

    1: 获取控件宽高 控件View有getHeight()和getwidth()方法可以获取宽高,但是如果直接在on...

  • 获取View宽高

    在onCreate()中获取View宽高 两种方法: 1.使用View.post(Runable runable)...

  • 获取View宽高

    我们应用在获取控件宽高的时候,都是调用控件View.getWidth()、View.getHeight()获取,但...

  • 测量方法&属性

    获取view的宽高属性 使用时机 些许bug View.getLayoutParams() View.getLef...

  • 如何正确获取View的宽高

    在onCreate中是获取不到View的宽高以及坐标的。使用View.post(Runnable)可以获取:

  • 获取View的宽高

    在onCreate中获取View的宽高,返回值都是0,因为在onCreate中,View还没绘制,所以返回值为0,...

  • View宽高的获取

    1、View的getWidth()和getMeasuredWidth()有什么区别吗? getMeasuredW...

网友评论

      本文标题:获取View的宽高

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