View测量

作者: 土肥圆的诺诺 | 来源:发表于2019-01-08 00:51 被阅读71次
    先亲亲
    View 的 getWidth()和 getMeasuredWidth()的区别

    getMeasuredWidth():先看一下API是这么说的:
    The width of this view as measured in the most recent call to measure(). This should be used during measurement and layout calculations only.
    此视图的宽度在最近调用Measure()时测量。这只能在测量和布局计算期间使用。

    • getWidth(): View在设定好布局后整个View的宽度。
    • getMeasuredWidth(): 对View上的内容进行测量后得到的View内容占据的宽度,前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure中的参数的值你自己可以定义),否则你得到的结果和getWidth()得到的结果是一样的。
    如何在 onCreate 中拿到 View 的宽度和高度?

    在开发过程中经常需要获取到View的宽和高,可以通过View.getWidth()和View.getHeight()来得到宽高。然而在onCreate方法中直接调用上面两个方法得到的值是0!
    这是为什么呢?
    因为View绘制是通过两个遍历来完成的,一个measure过程,一个layout过程。只有经过“测量”和“布局”之后,View才能正确地完成绘制。而这一切是发生在onCreate方法之后的。所以在onCreate中直接使用View.getWidth()和View.getHeight()是无法得到正确的值的。
    解决方案

    • View.post()
      该方法传递一个Runnable参数,然后将其添加到消息队列中,最后在UI线程中执行。
    view.post(new Runnable() {
                @Override
                public void run() {
                    //进行测量
                }
            });
    
    • OnGlobalLayoutListener
     view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    //  //现在布局全部完成,可以获取到任何View组件的宽度、高度、左边、右边等信息
                    // ,会调用过多次,可以加标识处理
                }
            });
    

    相关文章

      网友评论

        本文标题:View测量

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