項目地址:GitHub
經(jīng)常能碰到這樣一種需求:

- A 和 B 依次排開,B 必須緊貼著 A 的底部,這個好做,用線性排列就可以
- 在小屏幕上如果空間不足則 A 等比例縮小,B 不能縮小,這個也好做,用 RelativeLayout 讓 A 相對于 B 的上方顯示
但是要同時滿足這兩條要求就很麻煩,只能自己寫個自定義布局處理,思路是這樣的:
- 首先,給子 View 加標記:
shirk0 代表不縮放,值越大縮放速度越快,如果有多個要縮放的子 View 則按照 shirk 比例分配縮放量 - 然后在開始測量時先計算子 View 整體高度和,如果高度和小于父親的高度,則不用處理
- 如果高度大于父親的高度,則算出需要縮小的量
overflowSize = 子 View 高度和 - 父 View 高度,按照比例分配給子 View,比如子 View A, B, C 的 shirk 分別為 1,2,3,他們的高度和超出父 View 的高度為 overflowsSize,他們應(yīng)該縮小的量是:
- A = overflowSize * 1 / 6
- B = overflowSize * 2 / 6
- C = overflowSize * 3 / 6
但是還有個問題,如果 C 的高度小于 overflowSize * 3 / 6,則要繼續(xù)給 A 和 B 分配剩余的高度,直到把 overflowSize 分配完,所以這里要用遞歸處理
另外還要處理 View 之間的 margin 和 水平還是垂直的 LinearLayout
最終效果請查看 GitHub