web-dev-qa-db-ja.com

ビュー間の共有要素遷移(アクティビティまたはフラグメントではない)

ビューベースのアプローチを使用して、たとえば次の記事で説明されているようなAndroidアプリケーションを開発しているとしましょう: http://corner.squareup.com/2014/ 10/advocating-against-Android-fragments.html

これで、2つのフルスクリーンビューができました。 1つは表示され、画像のグリッドが含まれています。もう1つは非表示で、クリックする画像の詳細ビューです。グリッド内の画像をクリックしてもトランジションがない場合、グリッドビューは非表示になり、詳細ビューが表示されます。ここで、グリッドビューの小さな画像と詳細ビューの大きな画像の間で共有要素の遷移に似たものが必要な場合はどうなりますか。このようなことは可能ですか?

Image

18
Eugen

はい、トランジションはこれを可能にします。

この例では、グリッドビューと詳細ビューの両方がすでに階層にあります。トランジションを使用するには、詳細ビューがビュー階層で開始されていない方がうまく機能します。 2つのビューを交換する必要があります。

それを行うには2つの(同様の)方法があります。 1つは、シーンにグリッドビューを表示することです。次に、TransitionManager.go(detailScene、transition)を使用します。

2番目の方法は、TransitionManager.beginDelayedTransitionを使用してから、詳細レイアウトをグリッドレイアウトと交換することです。

共有ビューに共通点を持たせることが重要です。通常、これはビューIDまたはtransitionNameです。このリンクにより、ビューが異なるインスタンスであっても、遷移システムに通知されます。

使用するトランジションは@Android:transition/moveです。 ChangBounds、ChangeTransform、ChangeImageTransform、およびChangeClipBoundsを組み合わせたものです。これは、共有要素ビューをターゲットにする必要があります。ビューの開始および/または終了には、別のトランジション(フェード?)が必要になるようです。

このようなもの:

TransitionSet shared = ...
shared.addTarget("sharedName");
gridElement.setTransitionName("sharedName");
Fade fade = new Fade();
fade.excludeTarget("sharedName", true);
TransitionSet set = new TransitionSet();
set.addTransition(shared)
   .addTransition(fade);
TransitionManager.go(detailScene, set);
20
George Mount