1. 程式人生 > >Android ConstraintLayout layout_constraintDimensionRatio w h 備忘

Android ConstraintLayout layout_constraintDimensionRatio w h 備忘

注:以下結論由測試推測得到,僅僅是結果表現上合理,並非一定就是ConstraintLayout內部實現機制,不敢誤導他人,僅自己記錄備忘

ConstraintLayout layout_constraintDimensionRatio 可以設定一個字首 w或h,

根據官方說法

The ratio can be expressed either as:

  • a float value, representing a ratio between width and height
  • a ratio in the form "width:height"

You can also use ratio if both dimensions are set to MATCH_CONSTRAINT

(0dp). In this case the system sets the largest dimensions the satisfies all constraints and maintains the aspect ratio specified. To constrain one specific side based on the dimensions of another, you can pre append W," or H, to constrain the width or height respectively. For example, If one dimension is constrained by two targets (e.g. width is 0dp and centered on parent) you can indicate which side should be constrained, by adding the letter W
(for constraining the width) or H (for constraining the height) in front of the ratio, separated by a comma:

 當一個子元件的寬和高都設定為0dp的時候,可以用字首w或h指示,哪條邊(w或h)通過Ratio計算得到其長度。Android會先通過其他約束條件計算另一條邊的值,再通過Ratio  w:h=ratio 計算指定的邊(w或h)的值。

例如:w=0dp,h=0dp,toLeftOf="parent",toRightOf="parent",toTopOf="parent",toBottomOf="parent",根據約束條件,這個子元件會佔據父容器全部空間。這裡要如何限制元件寬高比,就根據ratio的字首而定。ratio="w,2:1",那麼子元件的h=父容器高(另一邊根據其他約束條件得到值),w:h=2:1, w=2h=2倍父容器高度(可能超出了顯示範圍),如果ratio="h,2:1",那麼子元件w=父容器寬(另一邊根據其他約束條件得到值),w:h=2:1,h=1/2*w=父容器寬度的一半。正常情況下ratio會按上面的方式工作

但如果出現下列情況,計算的結果很可能會出乎意料讓人疑惑

如: w=100dp,h=0dp,ratio="w,2:1" 此時w已經設定為固定長度,無法先通過其他約束條件計算h,再通過ratio計算w,設定衝突。此時Android計算出的實際結果,可以視為 Android 識別到了衝突,把原本w:h=ratio 替換為 h:w=ratio 來計算未知邊,也就是 w=100dp,h=0dp,ratio="w,2:1" 通過 h:w=2:1 計算未知邊h,h=2w=200dp,最後得到的結果,w=100dp,h=200dp。

同理:w=0dp,h=100dp,ratio="h,2:1",h已設定為固定值,衝突,改為 h:w=2:1計算w,w=1/2*h=50dp,最後結果w=50dp,h=100dp。

記錄備忘