解析ConstraintLayout的constraintDimensionRatio屬性

官網文檔圖片:

由文檔我們首先能得出以下結論:

  1. 如果要使用這個屬性,我們至少要把控件的寬或高中間的一個設置爲match constraints,具體怎麼設置就不再贅述(XML和View Inspector裏都可以).
  2. ratio的比值表示的是寬高比,注意,一直都是寬高比了解這兩點之後,問題來了,系統是怎麼知道我們究竟是"以寬爲準,按比例去設置高"呢? 還是"以高爲準,按比例去設置寬"呢?
  3. 瞭解這兩點之後,問題來了,系統是怎麼知道我們究竟是"以寬爲準,按比例去設置高"呢? 還是"以高爲準,按比例去設置寬"呢?我們首先注意到1.裏所說的,必須把寬或者高其中之一設爲match_constraint,而match_constraint的意思是滿足約束。爲什麼要這麼做呢?舉個例子,我們把layout_width設置爲match_constraint, layout_height設爲固定值100dp,那麼很顯然,高度是寫死的,寬度是需要滿足某種約束。此時,如果我們設置了layout_constraintDimensionRatio ="4:1",會出現什麼效果呢?很顯然,系統會保持高度爲100dp,而寬度爲高度的4倍,即400dp,從而“match_constraint”滿足約束。

約束width, layout_width="0dp"

同時約束,layout_width="0dp" && layout_height="0dp"

想象一個場景,我們想在佈局裏放一張banner,寬度鋪滿全屏,高度始終爲寬度的1/3。那麼我們首先爲了寬度鋪滿全屏,需要將width設爲match_constraint,又因爲高度需要跟寬度形成1:3的比例,所以高度也要同樣設置match_constraint,然後將app:layout_constraintDimensionRatio設爲"h,3:1"即可。

h和w參數的解釋

這裏我們還需要解釋一下app:layout_constraintDimensionRatio的值裏面的h和w是什麼意思。一般來說,加上h的意思就是,h之後的比例是以w爲基礎去設置h,即h = w / ratio。反之,寫上w的意思是,w = h * ratio (因爲 ratio = w / h 代表寬高比)。

 

 

我們可以看到,如果只把一條邊設爲0dp,那麼我們是無需添加h和w的(會有默認值)。因爲我們只能去通過未設爲0dp的邊來約束設爲0dp的那條邊,也就是說h和w就對應設爲0dp的那條邊。而如果兩條邊都設爲0dp,那麼就必須設置h和w了,不然系統不知道我們想約束哪條邊。原理還是一樣的,希望哪條邊被約束,我們就寫哪條邊的字母。

總結

以上主要還是想告訴大家這個屬性的原理,其實真正去用的時候還是用View Inspector來做的比較多。當我們把至少一條邊設爲match_constraint後,點擊方框左上角的toggle按鈕,可以設置對應的比例,方框裏顯示的橫線或豎線表示哪條邊是被限制,跟屬性裏的h和w是對應的。示例如下:

1.layout_width = "0dp" && layout_height = "0dp"

2.layout_height = "0dp"

3.layout_width = "0dp"

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章