好久沒有寫文章了!以至於我都不知道該寫什麼了?最近專案中對ConstraintLayout的使用明顯增多了!所以今天和大家分享一下關於ConstraintLayout的一些你應該瞭解的內容!
本文知識點
- ConstraintLayout的一些相應的屬性及展示;
- 約束的相關屬性
- 邊距相關的屬性
- 位置相關的屬性
- 鏈相關的屬性
- 輔助線相關的屬性
- 一些不知怎麼歸類的屬性
- ConstraintLayout佈局的時候應該注意的一些內容;
- 關於ID的問題
- 關於設定"0dp"的問題
- 關於螢幕適配的問題
1.ConstraintLayout的一些相應的屬性及展示
關於這個控制元件我想大家應該都見過,只不過是你沒有注意過吧!如果你的Android Studio的版本在3.0以上的話,那麼跟佈局一般都是ConstraintLayout,以前一般的做法都是,直接替換成相應的佈局,直到有一天,我突然發現這個控制元件如此之強大,強大到我都不再想用其它控制元件了!但是強烈建議你們使用程式碼去寫!不要使用拖拽的那種方式,因為我覺得每次拖拽的時候我的電腦卡的不行!這個理由是不是很牽強~~~哈哈!
關於ConstraintLayout屬性,我準備分成幾類進行講解
- 1.約束的相關屬性
- 2.邊距相關的屬性
- 3.位置相關的屬性
- 4.鏈相關的屬性
- 5.輔助線相關的屬性
- 6.一些不知怎麼歸類的屬性
1.1 約束的相關屬性
- layout_constraintLeft_toLeftOf
- layout_constraintLeft_toRightOf
- layout_constraintRight_toLeftOf
- layout_constraintRight_toRightOf
- layout_constraintTop_toTopOf
- layout_constraintTop_toBottomOf
- layout_constraintBottom_toTopOf
- layout_constraintBottom_toBottomOf
- layout_constraintBaseline_toBaselineOf
- layout_constraintStart_toEndOf
- layout_constraintStart_toStartOf
- layout_constraintEnd_toStartOf
- layout_constraintEnd_toEndOf
這裡和你說一個簡單方便記憶的方法,XXX_toXXXOf前面的是你現在的控制元件,後面的XXX是你要依賴的控制元件,拿layout_constraintLeft_toLeftOf說明一下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕1按鈕1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<Button
app:layout_constraintTop_toBottomOf="@id/btn1"
app:layout_constraintLeft_toLeftOf="@id/btn1"
app:layout_constraintRight_toRightOf="@id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕2" />
</android.support.constraint.ConstraintLayout>
複製程式碼
-
先主要看按鈕1的約束條件,按鈕1的左邊以父控制元件的左邊為約束條件,右邊以父控制元件的右邊為約束條件,這個時候,會有相應的居中顯示(也就是說,如果你左右都設定了約束條件的話,那麼如果有相應的空間,那麼它會居中顯示)!
-
在看按鈕2的約束條件,按鈕2的左邊以按鈕1的左邊為約束條件,按鈕2的右邊以按鈕1的右邊為約束條件,這裡注意一點,如果兩個控制元件不一樣大的時候,會以中心線對齊!
基本上就這麼多,沒有什麼好說的。這裡建議大家使用看一下效果,使用多了自然就知道效果了!
1.2 邊距相關的屬性
- android:layout_marginStart
- android:layout_marginEnd
- android:layout_marginLeft
- android:layout_marginTop
- android:layout_marginRight
- android:layout_marginBottom
- layout_goneMarginStart
- layout_goneMarginEnd
- layout_goneMarginLeft
- layout_goneMarginTop
- layout_goneMarginRight
- layout_goneMarginBottom
這裡的邊距和之前的邊距是一樣的,但是layout_goneMarginXXX這個屬性是當位置約束目標的可見性為View.GONE,您還可以使用以下屬性指示要使用的不同邊距值。這裡說明一下:如果你約束的控制元件GONE了之後,是以左上開始計算距離的,剩下的試一下你就知道了!
1.3 位置相關的屬性
首先我真的不知道,這麼分這些屬性是否正確,所以只要看相關的屬性就可以了!
1.3.1 百分比的屬性
- layout_constraintHorizontal_bias 水平的百分比
- layout_constraintVertical_bias 垂直的百分比
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕1按鈕1"
app:layout_constraintHorizontal_bias="0.3"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
複製程式碼
這裡的layout_constraintXXX_bias相當於一個百分比也就是距離的百分比,像上面的的就是距離左邊30%那麼右邊的就是70%了!
- app:layout_constraintDimensionRatio="1:1" 設定相應的寬高比
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="按鈕1"
app:layout_constrainedWidth="true"
app:layout_constraintDimensionRatio="1:1" />
</android.support.constraint.ConstraintLayout>
複製程式碼
上面是寬高比是"1:1",這裡預設是寬高比的!
如果你像設定高度比這樣寫就可以了**"h,2:1"**但是","別千萬別忘了
1.3.2 圓角半徑的一些屬性
- layout_constraintCircle :引用另一個小部件ID
- layout_constraintCircleRadius :到其他小部件中心的距離
- layout_constraintCircleAngle :小部件應該處於哪個角度(以度為單位,從0到360)
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕2"
app:layout_constraintCircle="@id/btn1"
app:layout_constraintCircleAngle="135"
app:layout_constraintCircleRadius="100dp" />
</android.support.constraint.ConstraintLayout>
複製程式碼
這裡為了更好的說明,所以我準備在用兩張圖說明一下:
首先,角度是逆時針計算的,半徑是以圖形的中心進行計算的!剩下的你寫一遍基本上就知道了!!!
1.3.3 限制的一些屬性
- android:minWidth 設定佈局的最小寬度
- android:minHeight 設定佈局的最小高度
- android:maxWidth 設定佈局的最大寬度
- android:maxHeight 設定佈局的最大高度
這些屬性沒有什麼說的,和之前一樣!
1.4 鏈相關的屬性
關於連結串列的屬性很有意思,我個人理解他是LinearLayout中weight的加強版!我們先說說簡單的實現吧!為什麼叫做鏈呢?因為所有的同方向的約束組成了一個鏈式結構!
- layout_constraintHorizontal_chainStyle
- layout_constraintVertical_chainStyle
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕1"
app:layout_constrainedWidth="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/btn2" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕2"
app:layout_constrainedWidth="true"
app:layout_constraintLeft_toRightOf="@id/btn1"
app:layout_constraintRight_toLeftOf="@id/btn3" />
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕3"
app:layout_constrainedWidth="true"
app:layout_constraintLeft_toRightOf="@id/btn2"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
複製程式碼
這裡要注意一個相應的問題,怎麼理解上面我說的鏈式結構呢?仔細看的童鞋,在上面這個例子中可能會發現,每一個控制元件左右的都有相應的約束,所以才叫連結串列式的結構!
這張圖完全能說明我上面說的內容!- layout_constraintHorizontal_weight
- layout_constraintVertical_weight
這裡既然說到LinearLayout就在這裡說一下這兩個屬性吧!因為這兩個屬性和weight屬性差不多,基本上的用法是一樣的
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="按鈕1"
app:layout_constrainedWidth="true"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/btn2" />
<Button
android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="按鈕2"
app:layout_constrainedWidth="true"
app:layout_constraintHorizontal_weight="2"
app:layout_constraintLeft_toRightOf="@id/btn1"
app:layout_constraintRight_toLeftOf="@id/btn3" />
<Button
android:id="@+id/btn3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="按鈕3"
app:layout_constrainedWidth="true"
app:layout_constraintHorizontal_weight="3"
app:layout_constraintLeft_toRightOf="@id/btn2"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
複製程式碼
這裡就是設定了相應的一些weight的屬性!效果圖就變成了這個樣子!!!
在說說上面的兩個屬性,關於這兩個屬性都差不多,只是一個是約束水平的一個是約束垂直的,還是用一張圖說明一下,看一眼效果你就知道了!!!
這張效果圖,說明了chainStyle可以設定的一些屬性!關於鏈式結構基本上注意的內容就這麼多!!!也都是平時專案上能用到的!但是千萬要注意一點,必須左右都有相應的約束!否則不會有這種效果
"三遍" 重要的事情說"三遍" 哈哈!!!
1.5 輔助線相關的屬性
在ConstraintLayout中有一個輔助線的概念,它是不會顯示在頁面上的,只是一條你假象的線,然後你可以以此為約束進行佈局!
- android:orientation 輔助線的方向
- app:layout_constraintGuide_begin 距離頂部的距離
- app:layout_constraintGuide_end 距離底部的距離
- app:layout_constraintGuide_percent 相當於父容器的百分比
<android.support.constraint.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="100dp" />
複製程式碼
可以看出,Guideline計算的距離都是依靠父容器的距離進行約束的,所以這裡你即使設定了相應的控制元件約束,其實是不好使的!我試過,但是如果你真的像以控制元件進行約束也不是不可以的,我的做法是:直接把控制元件的大小寫出來,這樣不用上面的三個距離的尺寸就可以進行相應的佈局了,雖然這樣有點傻!剩下兩個你試一下就可以了!圖就不往上貼了!!!
1.6 一些不知怎麼歸類的屬性
- layout_constraintBaseline_toBaselineOf 基線對其
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="按鈕1" />
<Button
android:id="@+id/btn2"
app:layout_constraintBaseline_toBaselineOf="@id/btn1"
app:layout_constraintLeft_toRightOf="@id/btn1"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:text="按鈕2" />
</android.support.constraint.ConstraintLayout>
複製程式碼
- layout_constraintWidth_percent
- layout_constraintHeight_percent
寬度和高度佔父控制元件的百分比,其中的值是0~1的!
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintWidth_percent="0.5"
app:layout_constraintHeight_percent="0.5"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="按鈕1" />
</android.support.constraint.ConstraintLayout>
複製程式碼
其實就相當於佔用父容器的百分比,上面就相當於50%
2. ConstraintLayout佈局的時候應該注意的一些內容
2.1 關於ID的問題
其實我也不是到是Android Studio還是SDK的版本影響,但是有的時候在使用鏈式結構的時候,會出現控制元件找不到的現象?為什麼呢?因為在使用鏈式結構的時候,前面往往使用後面的控制元件ID,但是有的時候就不會出現這種狀況,後來,我找到了一種解決方法,就是在前面引用的時候這樣寫"@+id/xxx",乍一看沒有什麼,但是其實多了一個"+"號,這個"+"號的作用是在沒有發現這個控制元件ID的時候,主動建立一個相應的ID!就醬紫。。。
2.2 關於設定"0dp"的問題
其實在不涉及到左右或者上下比例的情況下,只要你在相應方向都有約束的情況,那麼相應的方向上設定"0dp"的時候,它會直接鋪滿全屏的!但是如果涉及到左右或者上下比例的情況下,就需要設定相應的layout_constraintXXX_weight了!
2.3 關於螢幕適配的問題
都知道Android螢幕適配真的是一件非常頭疼的事情,其實這個控制元件能幫我們解決相當大的一部分問題;一般我的做法是使用layout_constraintXXX_percent直接把控制元件按照百分比進行相應的計算!能解決一部分的適配問題,但是內部的自己沒有辦法解決,需要你自己去解決!!!!
基本上知道了上面這些,對於這個控制元件的使用就可以非常輕鬆了!!!不知道還有沒有什麼落下的,如果有落下的我想起來在進行補充,如果你有什麼問題也可以給我留言,我看到了一定及時回覆你!!!