Note
この記事はcom.android.support.constraint:constraint-layout:2.0.0-alpha2
時点のMotionLayout
についての記述です。
まだアルファ版なので将来的に挙動が大きく変わる可能性があります。
MotionLayout 内にある RecyclerView をスクロール可能にする
MotionScene
内の<OnSwipe>
にmoveWhenScrollAtTop
というプロパティがあり、これがtrue
のときにRecyclerView
がスクロール可能になります。これがfalse
になると、アニメーションが動くべき方向にドラッグしたときにアニメーションが始まってしまいます。
たとえば、MotionScene で定義した動きとして縦にスクロールするRecyclerView を下にドラッグするとアニメーションするような場合、moveWhenScrollAtTop
がtrue
の場合は RecylerView のもつ 0 番目のアイテムが一番上にきたときにアニメーションを開始し、false
のときはスクロールせずにアニメーションを開始します。
RecylerView のスクロールと MotionLayout のアニメーション開始を別に扱いたい
moveWhenScrollAtTop
がtrue
のとき、RecyclerView を勢いよくフリングすると、0 番目のアイテムが一番上に来た直後に MotionLayout へMotionEvent
が流れてアニメーションが動いてしまいます。この動きは RecyclerView の定義にあるもので、自分がこれ以上スクロールできない位置まで来ると、NestedScroll できる親にMotionEvent
が流れるようになっています。
もし RecyclerView のスクロールに続いて MotionLayout のアニメーションを動かしたくない(RecyclerView のスクロールジェスチャと MotionLayout のスワイプジェスチャを別にする)場合は、RecyclerView のnestedScrollingEnabled
をfalse
にします。
ただし、RecyclerView の ViewPort が一番端にないときに MotionLayout のアニメーションを動かすと、つぎに RecyclerView でスクロールジェスチャをしようとすると RecyclerView はスクロールせず MotionLayout のアニメーションが始まってしまうバグが起きる可能性があります。