ConstraintLayout 2.0 — Flow、Layer、MotionLayout

Evan Chen
Evan Android Note
Published in
Dec 30, 2020

ConstraintLayout 2.0在2020年8月終於正式釋出了。我們就來看一下新增了哪些功能。在開始之前,如果你還不熟ConstraintLayout,可以先看看之前寫的這篇ConstraintLayout在1.0版本的介紹。

Flow

Flow是一個虛擬佈局。用來建立一個虛擬的View群組。以前想要做到像下圖的這個效果可能要用RecyclerView做。現在用Constraint Layout 的Flow可以很輕鬆的做到。

在ConstraintLayout裡新增一個Flow,接著新增要透過Flow控制的View,以上圖的例子就是新增6個Button。那麼Flow要知道哪幾個View被當作一個群組就是透過app:constraint_referenced_ids 裡把Button的id加進來。就可以用這個Flow來控制這6個Button怎麼呈現。

app:constraint_referenced_ids="button1,button2,button3,button4,button5,button6"

接著你可以透過flow_wrapMode來設定模式:

app:flow_wrapMode="none"

設定為none時,只會有一列水平置中排列,而超過的部分會被截掉。

app:flow_wrapMode="chain"

當超出範圍時,會形成另一條鏈

app:flow_wrapMode="aligned"

當超出範圍時,一樣會形成另一條鏈,只是會置左對齊。

另外你還可以設定排列方式:

app:flow_horizontalStyle="spread_inside"

app:flow_horizontalStyle="spread"

app:flow_horizontalStyle="packed"

而同樣的style你可以只約束第一行或最後一行

//只設定第一行
app:flow_firstHorizontalStyle="spread"
//只設定最後一行
app:flow_lastHorizontalStyle="spread"

設定每行顯示幾個

app:flow_maxElementsWrap="4"

設定View與View的間隔

app:flow_verticalGap=”30dp”

除了用水平的方式排列,你也可以改成垂直的方式。

android:orientation="vertical"
app:flow_verticalStyle="spread"

Layer

Layer 也是一個虛擬的圖層,但和Flow不同的是,它不是用來佈局的,而是用來對多個View同時操作,例如要對多個View一起旋轉、移動、縮放等等。用Layer的好處是不會增加View的層級。

例如下圖要讓一個ImageView與TextView一起旋轉。以前的做法你可能只能把ImageView與TextView放在一個Layout裡面,再針對這個Layout旋轉,但這樣的缺點就是你的View的層級變多了。

在ConstraintLayout裡加一個Layer,在Layer的app:constraint_referenced_ids 裡要把要控制的View,也就是ImageView及TextView的id加進來。

app:constraint_referenced_ids="imageView,textView"

針對Layer加上動畫,ImageView及TextView就會一起連動了。

你也可以設定把整個Layer都隱藏

layer.visibility = View.GONE

MotionLayout

Motion Layout 可以讓我們用xml 的方式宣告動畫,例如下方的這兩個動畫。

請參考這兩篇:MotionLayoutMotionLayout KeySet,而在Android Studio 4.0之後,也提供了視覺編輯工具MotionEditor,讓你更方便編輯Motion Layout。

參考:

--

--