关于View的知识

  • 1.view的getWidth和getmeasureWidth的区别

    结论:getwidith拿到的是在layout之后,根据view的四个点计算出来的宽度,而getmeasureWidth是view原本的宽度。这2个方法一般来讲得到的数据是不会不同的,只有可能在onmeasure和layout之后,手动调用了measure(0,0)才会可能导致数据不一样。
    在这里插入图片描述
    在这里插入图片描述
    这2个方法都是简单的赋值操作,具体的行为发生在onmeasure和layout里。
    在这里插入图片描述
    在onmeasure里,调用了setMeasureDimension,里面的getDefaultSize的方法,根据MeasureSpec返回相应的数值。
    在这里插入图片描述
    在setMeasureDimension里,根据getDefaultSize里返回的值,进行计算得出新值。
    在这里插入图片描述
    最后对成员变量进行赋值操作。这里就得到了getMeausreWidth的值。

在这里插入图片描述

layout里调用了setFrame,在setFrame里对left,right等四个点进行了赋值。
在这里插入图片描述

  • 2 在oncreate里怎么获取view的宽高。
  • (1)view.post
  • (2)windowFouceChange
  • (3)addOnGlobalLoayoutListener
  • (4)view.measure(0,0)之后再调用getMeasureWidth就能拿到值
  • (5)为什么view.measure(0,0)之后能拿到值
  • 在这里插入图片描述
    这个方法接受的两个参数,是关于view的测量方式,这里不谈,总之传了0,0代表测量方式为UNSPECIFIED.然后会调用onmeasure方法。在这里插入图片描述
    在onmeasure方法里面会走之前的流程,也就会对mMeasureWidth赋值,所以之后调用getMeasureWidth方法就能拿到view的宽度。
    ps:如果是自定义view,在onmeasure方法里,你根据测量方式进行了测量的更改,那么measure(0,0)之后可能会导致数据不对。

猜你喜欢

转载自blog.csdn.net/weixin_43104619/article/details/84776319