ConstraintLayout 2.0 — Flow、Layer、MotionLayout
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 的方式宣告動畫,例如下方的這兩個動畫。
請參考這兩篇:MotionLayout、MotionLayout KeySet,而在Android Studio 4.0之後,也提供了視覺編輯工具MotionEditor,讓你更方便編輯Motion Layout。
參考: