Android中view的测量过程中,很重要的也很难理解的一个东西MeasureSpec

来源:互联网 发布:淘宝评论在哪里写 编辑:程序博客网 时间:2024/05/16 12:45

Android的app开发时,自定义view是一个很普遍、重要、容易提升用户体验的一个办法。

自定义view的3个关键点是,测量、摆放、绘制。

本文主要就测量中一个很重要的也很难理解的东西MeasureSpec,作一个小小的解析,如有错漏,还请不吝赐教。




view有子view的话,则父view和子view之间要有个协商,以避免子view的大小超过了父view的大小,导致子view显示不全(一个关键逻辑是,子view的显示区域不超过父view的显示区域)。当然子view不并一定要按照这个协商来设定自身的大小,但是一般还是参照这个协商来设定自身的大小。
这个协商,则是通过MeasureSpec来实现的。宽和高,各有一个协商,即各有一个MeasureSpec。


measureSpec是一个32位的int,前2位表示协商模式,后30位表示参考大小,协商模式有3种,
EXACTLY(特定)            表示父view希望子view,把自己的大小设置为,参考大小的值
AT_MOST(不超过)        表示父view希望子view,把自己的大小设置为,不超过参考大小的值
UNSPECIFIED(随意)   表示父view希望子view,把自己的大小设置为,随意大小,子view想怎么设置就怎么设置 


例子1   一个父view把自身的大小设置为,宽300px,高400px,它传给子view的用来协商大小的measureSpec,协商模式是AT_MOST,参考大小是宽300px,高400px,那么父view的意思就是,希望子view不要把自己的大小设置的超过了宽300px,高400px,否则容易导致子view显示不全。


例子2   一个父view把自身的大小设置为,宽300px,高400px,它传给子view的用来协商大小的measureSpec,协商模式是EXACTLY, 参考大小是宽300px,高210px,那么父view的意思就是,希望子view把自己的大小就设置为宽270px,高210px,也就是父view希望子view宽是特定的270px,高是特定的210px


例子3   一个父view把自身的大小设置为,宽300px,高400px,它传给子view的用来协商大小的measureSpec,协商模式是UNSPECIFIED,参考大小是宽300px,高400px,那么父view的意思就是,希望子view设置自己的大小时,随意设置,子view想怎么设置就怎么设置。这种情况一般见于,类似listview的自定义view,子view的高度可以随意,比父view高也没关系,因为可以滑动显示。

原创粉丝点击