Infinito Nirone 7

白羽の矢を刺すスタイル

MotionLayout 内にある RecyclerView のスクロールを制御する

Note

この記事はcom.android.support.constraint:constraint-layout:2.0.0-alpha2時点のMotionLayoutについての記述です。 まだアルファ版なので将来的に挙動が大きく変わる可能性があります。

MotionLayout 内にある RecyclerView をスクロール可能にする

MotionScene内の<OnSwipe>moveWhenScrollAtTopというプロパティがあり、これがtrueのときにRecyclerViewがスクロール可能になります。これがfalseになると、アニメーションが動くべき方向にドラッグしたときにアニメーションが始まってしまいます。

たとえば、MotionScene で定義した動きとして縦にスクロールするRecyclerView を下にドラッグするとアニメーションするような場合、moveWhenScrollAtToptrueの場合は RecylerView のもつ 0 番目のアイテムが一番上にきたときにアニメーションを開始し、falseのときはスクロールせずにアニメーションを開始します。

RecylerView のスクロールと MotionLayout のアニメーション開始を別に扱いたい

moveWhenScrollAtToptrueのとき、RecyclerView を勢いよくフリングすると、0 番目のアイテムが一番上に来た直後に MotionLayout へMotionEventが流れてアニメーションが動いてしまいます。この動きは RecyclerView の定義にあるもので、自分がこれ以上スクロールできない位置まで来ると、NestedScroll できる親にMotionEventが流れるようになっています。

もし RecyclerView のスクロールに続いて MotionLayout のアニメーションを動かしたくない(RecyclerView のスクロールジェスチャと MotionLayout のスワイプジェスチャを別にする)場合は、RecyclerView のnestedScrollingEnabledfalseにします。 ただし、RecyclerView の ViewPort が一番端にないときに MotionLayout のアニメーションを動かすと、つぎに RecyclerView でスクロールジェスチャをしようとすると RecyclerView はスクロールせず MotionLayout のアニメーションが始まってしまうバグが起きる可能性があります。