自定義view之什么MeasureSpec

測量模式只有3種情況,用2bit就可以存放。int measureSpec:包含測量尺寸和測量模式。int型數(shù)據(jù)32個bit,將前2個bit用于存放測量模式,后面30個bit存放的是尺寸。取數(shù)時,不用每次都寫移位<<和取且&操作,用Android內置類MeasureSpec.getMode(),MeasureSpec.getSize()
這里的的尺寸大小getSize()并不是最終View的尺寸大小,而是父View提供的參考大小。
1.MeasureSpec.EXACTLY:表示設置了精確的值,一般當childView設置其寬、高為精確值(例如layout_width="100dp")、match_parent時,父容器會將其設置為EXACTLY;
2.MeasureSpec.AT_MOST:表示子布局被限制在一個最大值內,一般當childView設置其寬、高為wrap_content時,父容器會將其設置為AT_MOST;
3.MeasureSpec.UNSPECIFIED:表示子布局想要多大就多大,一般出現(xiàn)在AadapterView的item的heightMode中、ScrollView的childView的heightMode中;此種模式比較少見。
三種測量模式最高位對應什么?
0-unspecified 00-000000000000000000000000000000
1-exactly? 01-000000000000000000000000000000
2-at_most? 10-0000000000000000000000000000000(int的最小值)
為什么int的最小值是10-0000000000000000000000000000000?
因為int的最小值是-2^32,32bit只能表示到11-111111111111111111111111111111即-2^31,所以規(guī)定-0就是最小值-2^32。并且它沒有原碼和反碼。
計算機為什么用補碼?
計算機電路只有加法器,這是為了電路簡單,不是設計不出來減法器。人們要解決的是如何把減法變成加法。
使用原碼,符號位參與運算導致錯誤:1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [1000 0010]原= -2
使用反碼,0出現(xiàn)了兩種表示:1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]反+ [1111 1110]反= [1111 1111]反= [1000 0000]原= -0
使用補碼:1-1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]補+ [1111 1111]補= [1 0000 0000]補=[0000 0000]補=[0000 0000]
負數(shù)的補碼是在反碼基礎上加了1的,相當于變大了,對于計算機來說是利用1 0000 0000溢出損失使之歸零,就不用通過運算得到0。
-128的由來如下:(-1) + (-127) = [1000 0001]原+ [1111 1111]原= [1111 1111]補+ [1000 0001]補= [1000 0000]補
-0的補碼來表示-128,所以-128并沒有原碼和反碼表示。(對-128的補碼表示[1000 0000]補,算出來的原碼是[0000 0000]原,這是不正確的)
補碼是怎么來的?
即計算機如何實現(xiàn)減法變成加法?
mod運算的數(shù)學定義:x mod y=x -( y * (x/y的下界)),對于負數(shù)也適用。
對于時鐘,回撥4小時等于前撥8小時,(-4) mod 12 = 8,8 mod 12 = 8,-4和8同余,記為(-4) ≡ 8 (mod 12)。
如果為一個負數(shù)找到正數(shù)同余數(shù),在模運算的線性可加性下,8也就代替了-4。
x ≡ x (mod 12)(反身性)
(-4) ≡ 8 (mod 12)
x + (-4) ≡ x + 8 (mod 12)(線性可加)
一個數(shù)的反碼,實際上是這個數(shù)對于一個模的同余數(shù),原碼的減法和反碼的加法通過“≡”建立了關系(反正不是等價關系,也不是一一對應關系)。這里看似用反碼也能正確運算,但不要忘了“同余”這個關系沒法通過正常加法得到0,只能通過溢出歸零的方式。而同余數(shù)全體加1,相當于增加了模的值。
1 ≡ 1 (mod 12)(正數(shù)的反碼是本身)
(-1) ≡ 11 (mod 12)
1 + (-1) ≡ 1 + 11 (mod 12)
反碼得12,原碼要么是12,要么是-0(在計算機中0當?shù)姆创a是0),而正確答案是0,如果
1 ≡ 1 (mod 13)(正數(shù)的補碼是本身)
(-1) ≡ 12 (mod 13)
1 + (-1) ≡ 1 + 12 (mod 13)
補碼得13,溢出,歸零。
參考:
https://mp.weixin.qq.com/s__biz=MzI0OTQwNDQxMw==&mid=2247483760&idx=1&sn=27cbdd41da43b5b71c9f7a3ae807fae6&chksm=e9934fe2dee4c6f4869f6d46004c2f3a76c3b5aefc1d1acc8acd9504c64e9a8143f21fe2c968&scene=27
https://blog.csdn.net/qq_48435252/article/details/127554025?ops_request_misc=&request_id=&biz_id=102&utm_term=MeasureSpec&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-127554025.nonecase&spm=1018.2226.3001.4187