MeasureSpec的理解
從單詞的名字上看貌似“測(cè)量規(guī)格”或者“測(cè)量說(shuō)明書(shū)”這一類(lèi)蚓峦,不管怎么說(shuō)滴劲,它是一種會(huì)影響View的規(guī)則砸狞,隨意掌眠,如果我們要測(cè)量View的大小就必須要弄懂它
三種類(lèi)型
1. UNSPECIFIED
父容器不對(duì)View有任何限制怔软,要多大就給多大第美,這種模式一般用于系統(tǒng)內(nèi)部瑟慈,標(biāo)志是一種測(cè)量狀態(tài)一汽。
2. EXACTLY
父容器已經(jīng)檢測(cè)出View所需要的精確大小萧芙,這個(gè)時(shí)候View的最終打消就是SpecSize所指定的值阱冶,它對(duì)英語(yǔ)LayoutParams中的match_parent和具體數(shù)值這兩種模式醋安。
3. AT_MOST
父容器指定了一個(gè)可用大小即 SpecSize杂彭, View 的大小不能大于這個(gè)值,具體是什么要看View的具體實(shí)現(xiàn)吓揪,對(duì)英語(yǔ)LayoutParams里面的warp_content亲怠。
簡(jiǎn)要總結(jié)
對(duì)于一個(gè)普通的View,其MeasureSpec由父容器的MeasureSpec和自身的LayoutParams來(lái)共同決定柠辞,那么對(duì)于不通的父容器和View本身不通的LayoutParams团秽,View就有多種MeasureSpec:
- 當(dāng)View采用固定寬高的時(shí)候,父容器不管是什么叭首,View的MeasureSpec都是精確模式习勤,并且其大小遵循LayoutParams中的大小焙格;
- 當(dāng)View的寬高是match_parent的時(shí)候图毕,如果父容器是精準(zhǔn)模式,那么View也將是精準(zhǔn)模式眷唉,并且大小是父容器的剩余大小予颤,如果父容器是最大模式,那么View也會(huì)是最大模式冬阳,并且大小不會(huì)超過(guò)父容器的剩余大懈蚺啊;
- 當(dāng)View的寬高是warp_content的時(shí)候ioyu摩泪,不管父容器的模式是精準(zhǔn)還是最大化笆焰,View的模式總是最大化并且大小不能超過(guò)父容器的剩余空間;
- 我們分析中遺漏了UNSPECIFIED模式见坑,那是因?yàn)檫@個(gè)模式主要用于系統(tǒng)內(nèi)部多次Measure的情形嚷掠,一般來(lái)說(shuō)我們不需要關(guān)注