您的位置:首页 > 移动开发 > Android开发

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

2017-06-05 22:27 330 查看
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高也没关系,因为可以滑动显示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息