web-dev-qa-db-ja.com

animateLayoutChangesメカニズムで使用されるアニメーションを変更するにはどうすればよいですか?

ユーザーがアイテムを選択するRecyclerViewがあります。選択すると、特定のビューがテキストの前に表示されます(画像を参照)。その外観をアニメーション化したい。

Graphical representation

アイテムのレイアウトのanimateLayoutChangesプロパティは、ビューの外観のアニメーションタイプを除いて、完全に機能します。フェードインします。0〜100%のサイズにスケーリングしたいのですが、「ポップアップ」アニメーションと呼ばれています。 。

animateLayoutChangesを無効にしてXMLアニメーションを使用すると機能しますが、近くのテキストはアニメーション化されません(ビューとその余白に合わせてスライドするはずです)。すぐに右にシフトし、アニメーションが再生されます。テキストが消える前にテキストがビューと重なるため、逆のアニメーションではこれはさらに悪くなります。

だから、どういうわけかデフォルトのメカニズムと自分のアニメーションを組み合わせる必要があります。カスタムアニメーションを掘り下げることなくそれを達成する最も簡単な方法は何でしょうか?

21
mrnateriver

間違った場所を何度も掘り下げた後、自分で答えを見つけました。誰かを助けるかもしれません。

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リファレンスドキュメント をご覧ください。

34
mrnateriver