面試問題:
ConstraintLayout在項目中實踐與總結
我的理解:
添加依賴
<span style="color:#000000"><span style="color:#cccccc"><code class="language-bash"> implementation 'com.android.support.constraint:constraint-layout:1.1.3'</code></span></span>
相對定位:替代RelativeLayout的用法
<span style="color:#000000"><span style="color:#cccccc"><code class="language-objectivec"> <span style="color:#67cdcc"><</span>TextView
android:id<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView2"</span>
...
app:layout_constraintLeft_toRightOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView1"</span> <span style="color:#67cdcc">/</span><span style="color:#67cdcc">></span>
<span style="color:#67cdcc"><</span>TextView
android:id<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView3"</span>
...
app:layout_constraintTop_toBottomOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView1"</span> <span style="color:#67cdcc">/</span><span style="color:#67cdcc">></span></code></span></span>
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_toEndOf
居中
<span style="color:#000000"><span style="color:#cccccc"><code class="language-bash">app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"</code></span></span>
尺寸約束
官方不推薦在ConstraintLayout中使用match_parent,可以設置 0dp
<span style="color:#000000"><span style="color:#cccccc"><code class="language-objectivec"><span style="color:#67cdcc"><</span>TextView
android:id<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView1"</span>
android:layout_width<span style="color:#67cdcc">=</span><span style="color:#7ec699">"0dp"</span>
android:layout_height<span style="color:#67cdcc">=</span><span style="color:#7ec699">"wrap_content"</span>
android:layout_marginLeft<span style="color:#67cdcc">=</span><span style="color:#7ec699">"50dp"</span>
app:layout_constraintLeft_toLeftOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"parent"</span>
app:layout_constraintRight_toRightOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"parent"</span>
android:visibility<span style="color:#67cdcc">=</span><span style="color:#7ec699">"visible"</span> <span style="color:#67cdcc">/</span><span style="color:#67cdcc">></span></code></span></span>
寬設置爲0dp,寬高比設置爲1:1,這個時候TextView1是一個正方形
<span style="color:#000000"><span style="color:#cccccc"><span style="color:#404040"><code class="language-xml">layout_constraintHorizontal_weight:橫向的權重
layout_constraintVertical_weight:縱向的權重</code></span></span></span>
<span style="color:#000000"><span style="color:#cccccc"><span style="color:#404040"><code class="language-objectivec"> <span style="color:#67cdcc"><</span>TextView
android:id<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView1"</span>
android:layout_width<span style="color:#67cdcc">=</span><span style="color:#7ec699">"0dp"</span>
android:layout_height<span style="color:#67cdcc">=</span><span style="color:#7ec699">"wrap_content"</span>
app:layout_constraintLeft_toLeftOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"parent"</span>
app:layout_constraintRight_toLeftOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView2"</span>
app:layout_constraintHorizontal_weight<span style="color:#67cdcc">=</span><span style="color:#7ec699">"2"</span> <span style="color:#67cdcc">/</span><span style="color:#67cdcc">></span>
<span style="color:#67cdcc"><</span>TextView
android:id<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView2"</span>
android:layout_width<span style="color:#67cdcc">=</span><span style="color:#7ec699">"0dp"</span>
android:layout_height<span style="color:#67cdcc">=</span><span style="color:#7ec699">"wrap_content"</span>
app:layout_constraintLeft_toRightOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView1"</span>
app:layout_constraintRight_toLeftOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView3"</span>
app:layout_constraintRight_toRightOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"parent"</span>
app:layout_constraintHorizontal_weight<span style="color:#67cdcc">=</span><span style="color:#7ec699">"3"</span> <span style="color:#67cdcc">/</span><span style="color:#67cdcc">></span>
<span style="color:#67cdcc"><</span>TextView
android:id<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView3"</span>
android:layout_width<span style="color:#67cdcc">=</span><span style="color:#7ec699">"0dp"</span>
android:layout_height<span style="color:#67cdcc">=</span><span style="color:#7ec699">"wrap_content"</span>
app:layout_constraintLeft_toRightOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView2"</span>
app:layout_constraintRight_toRightOf<span style="color:#67cdcc">=</span><span style="color:#7ec699">"parent"</span>
app:layout_constraintHorizontal_weight<span style="color:#67cdcc">=</span><span style="color:#7ec699">"4"</span> <span style="color:#67cdcc">/</span><span style="color:#67cdcc">></span></code></span></span></span>
CHAIN_SPREAD —— 展開元素 (默認);
CHAIN_SPREAD_INSIDE —— 展開元素,但鏈的兩端貼近parent;
CHAIN_PACKED —— 鏈的元素將被打包在一起。
<LinearLayout
android:id="@+id/view_body"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_22"
app:layout_constraintHorizontal_weight="1.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/view_rate2"
app:layout_constraintTop_toBottomOf="@id/view_line">
<ImageView
android:id="@+id/iv_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/icon_body" />
<TextView
android:id="@+id/tv_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="體質特徵" />
</LinearLayout>
<LinearLayout
android:id="@+id/view_rate2"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintHorizontal_weight="1.0"
app:layout_constraintLeft_toRightOf="@+id/view_body"
app:layout_constraintRight_toLeftOf="@+id/view_oxy3"
app:layout_constraintTop_toTopOf="@+id/view_body">
<ImageView
android:id="@+id/iv_rate2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/icon_body" />
<TextView
android:id="@+id/tv_rate2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="心率檢測" />
</LinearLayout>
<LinearLayout
android:id="@+id/view_oxy3"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintHorizontal_weight="1.0"
app:layout_constraintLeft_toRightOf="@+id/view_rate2"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/view_body">
<ImageView
android:id="@+id/iv_body3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/icon_body"
android:src="@mipmap/icon_body" />
<TextView
android:id="@+id/tv_body3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血液黏度" />
</LinearLayout>
<span style="color:#000000"><span style="color:#cccccc"><span style="color:#404040"><code class="language-xml"><span style="color:#e2777a">android:layout_marginLeft不生效</span></code></span></span></span>
但是在ConstraintLayout裏,是不生效
<span style="color:#000000"><span style="color:#cccccc"><code class="language-xml"><span style="color:#e2777a"><span style="color:#cccccc"><</span>android.support.constraint.ConstraintLayout
android:layout_width<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>match_parent<span style="color:#cccccc">"</span></span>
android:layout_height<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>match_parent<span style="color:#cccccc">"</span></span><span style="color:#cccccc">></span></span>
<span style="color:#e2777a"><span style="color:#cccccc"><</span>TextView
android:id<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>@+id/TextView1<span style="color:#cccccc">"</span></span>
android:layout_width<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>wrap_content<span style="color:#cccccc">"</span></span>
android:layout_height<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>wrap_content<span style="color:#cccccc">"</span></span>
android:layout_marginLeft<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>10dp<span style="color:#cccccc">"</span></span>
android:layout_marginTop<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>10dp<span style="color:#cccccc">"</span></span> <span style="color:#cccccc">/></span></span>
<span style="color:#e2777a"><span style="color:#cccccc"></</span>android.support.constraint.ConstraintLayout<span style="color:#cccccc">></span></span></code></span></span>
<span style="color:#000000"><span style="color:#cccccc"><code class="language-xml"><span style="color:#e2777a"><span style="color:#cccccc"><</span>android.support.constraint.ConstraintLayout
android:layout_width<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>match_parent<span style="color:#cccccc">"</span></span>
android:layout_height<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>match_parent<span style="color:#cccccc">"</span></span><span style="color:#cccccc">></span></span>
<span style="color:#e2777a"><span style="color:#cccccc"><</span>TextView
android:id<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>@+id/TextView1<span style="color:#cccccc">"</span></span>
android:layout_width<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>wrap_content<span style="color:#cccccc">"</span></span>
android:layout_height<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>wrap_content<span style="color:#cccccc">"</span></span>
android:layout_marginLeft<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>10dp<span style="color:#cccccc">"</span></span>
android:layout_marginTop<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>10dp<span style="color:#cccccc">"</span></span>
app:layout_constraintLeft_toLeftOf<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>parent<span style="color:#cccccc">"</span></span>
app:layout_constraintTop_toTopOf<span style="color:#7ec699"><span style="color:#cccccc">=</span><span style="color:#cccccc">"</span>parent<span style="color:#cccccc">"</span></span><span style="color:#cccccc">/></span></span>
<span style="color:#e2777a"><span style="color:#cccccc"></</span>android.support.constraint.ConstraintLayout<span style="color:#cccccc">></span></span></code></span></span>
layout_goneMarginStart
layout_goneMarginEnd
layout_goneMarginLeft
layout_goneMarginTop
layout_goneMarginRight
layout_goneMarginBottom
網頁:或者替換android的當百分比佈局用
<span style="color:#000000"><span style="color:#cccccc"><span style="color:#404040"><code class="language-xml">layout_constraintVertical_bias:垂直乖離率(bias有道翻譯爲乖離率),也就是垂直偏移率。
layout_constraintHorizontal_bias:水平乖離率(bias有道翻譯爲乖離率),也就是水平偏移率。
layout_constraintHeight_percent:高度百分比,佔父類高度的百分比
layout_constraintWidth_percent:寬度百分比,佔父類寬度的百分比</code></span></span></span>
<span style="color:#000000"><span style="color:#cccccc"><span style="color:#404040"><code class="language-xml">layout_constraintHorizontal_bias</code></span></span></span>
ConstraintLayout+ConstraintSet實現動畫效果
<span style="color:#000000"><span style="color:#cccccc"><code class="language-objectivec"> app:layout_constraintCircle<span style="color:#67cdcc">=</span><span style="color:#7ec699">"@+id/TextView1"</span>
app:layout_constraintCircleAngle<span style="color:#67cdcc">=</span><span style="color:#7ec699">"120"</span></code></span></span>
當你的父控件爲ConstraintLayout,可以利用這個屬性來控制當前View的寬高比。在利用這個屬性時,你必須指明一個方向上的大小爲0dp,另一個方向可指定爲明確的dp值也可以使用wrap_content這樣才能夠按照比例來爲你擺放