ConstraintLayout约束布局layout_constraintDimensionRatio中的w/h究竟是什么意思?

1,364 阅读2分钟

之前使用这个属性呢,就记住了,设置的是宽高比,一次偶然的机会,发现还可以设置w/h,例如

app:layout_constraintDimensionRatio="w,4:3"

于是查阅了相关的技术文章,发现很多文章的说法是,w代表了宽高比,h代表了高宽比。
但是我带着这个思路进行实践的时候发现效果并不和预期一致,例如:

<View
    android:layout_width="0dp"
    android:layout_height="100dp"
    android:background="@android:color/holo_blue_bright"
    app:layout_constraintDimensionRatio="h,4:3"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

各位也可以尝试一下,如上的写法控件是无法显示的。
按照h代表了高宽比的理解,height是100dp,那么width可以计算出是75dp。 那么为什么会无法显示呢,既然对这些技术文章的结论存有疑义,那么是时候该翻阅官方文档了,文档内容如下,已经用Chrome翻译过了。

Dingtalk_20220329232349.jpg 英文好的同学也可以自行查看: developer.android.google.cn/reference/a…
从官方文档中我们可以得出两个关键的信息
1.ratio始终代表宽高比。
2.w/h的含义是约束宽度或者高度。

什么叫约束宽度或者高度,MATCH_CONSTRAINT(0dp)的含义是满足约束,这里就可以简单的理解成需要计算的是宽度还是高度
w代表约束width,需要计算的是width,即基于height满足比例计算width。
h代表约束height,需要计算的是heigth,即基于width满足比列计算heigth。
到这里我们就可以完全解释,上面的例子为什么无法显示,因为h代表基于width计算heigth,width是0dp,所以无法计算出heigth。
如果不写w/h,那么会自动将MATCH_CONSTRAINT(0dp)的维度作为需要计算的维度。
至此w/h的含义已经基本解释清楚了,最后在这里也是提议大家作为研发人员,写文章做分享,至少要经过自己的验证,不要人云亦云,减少错误概念结论的传播。