ユーザーがアイテムを選択するRecyclerView
があります。選択すると、特定のビューがテキストの前に表示されます(画像を参照)。その外観をアニメーション化したい。
アイテムのレイアウトのanimateLayoutChanges
プロパティは、ビューの外観のアニメーションタイプを除いて、完全に機能します。フェードインします。0〜100%のサイズにスケーリングしたいのですが、「ポップアップ」アニメーションと呼ばれています。 。
animateLayoutChanges
を無効にしてXMLアニメーションを使用すると機能しますが、近くのテキストはアニメーション化されません(ビューとその余白に合わせてスライドするはずです)。すぐに右にシフトし、アニメーションが再生されます。テキストが消える前にテキストがビューと重なるため、逆のアニメーションではこれはさらに悪くなります。
だから、どういうわけかデフォルトのメカニズムと自分のアニメーションを組み合わせる必要があります。カスタムアニメーションを掘り下げることなくそれを達成する最も簡単な方法は何でしょうか?
間違った場所を何度も掘り下げた後、自分で答えを見つけました。誰かを助けるかもしれません。
animateLayoutChanges
プロパティを有効にすると、LayoutTransition
のインスタンスを使用してViewGroup
でジョブが実行されます。
したがって、アニメーションを変更するには、LayoutTransition
のインスタンスを作成し、変更する必要がある遷移にAnimator
を設定して、そのインスタンスをsetLayoutTransition()
。
私の場合、結果は次のとおりです。
Animator scaleDown = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 1, 0), PropertyValuesHolder.ofFloat("scaleY", 1, 0));
scaleDown.setDuration(300);
scaleDown.setInterpolator(new OvershootInterpolator());
Animator scaleUp = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 0, 1), PropertyValuesHolder.ofFloat("scaleY", 0, 1));
scaleUp.setDuration(300);
scaleUp.setStartDelay(300);
scaleUp.setInterpolator(new OvershootInterpolator());
LayoutTransition itemLayoutTransition = new LayoutTransition();
itemLayoutTransition.setAnimator(LayoutTransition.APPEARING, scaleUp);
itemLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, scaleDown);
ViewGroup av = (ViewGroup)v.findViewById(R.id.animated_layout);
av.setLayoutTransition(itemLayoutTransition);
詳細は LayoutTransitionリファレンスドキュメント をご覧ください。