web-dev-qa-db-ja.com

ChangeImageTransformで共有要素の遷移を使用して2つのアクティビティ間でImageViewをアニメーション化する

Android APIレベル21の2つのアクティビティの間の1つのImageViewを別の位置にアニメーション化しようとしています。Android Lプレビューの「MoveImage」が削除されたため、代わりに " ChangeImageTransform "を使用しますが、ドキュメント内のサンプルコードは機能しません(2つの画像が個別にアニメーション化されます)。

<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <changeImageTransform>
        <targets>
            <target Android:targetId="@id/ivA" />
            <target Android:targetId="@id/ivB" />
        </targets>
    </changeImageTransform>
</transitionSet>

実用的な例はありますか?ありがとう!

17
iForests

共有要素を持つ2つのアクティビティ間で画面遷移アニメーションを作成するには、 この記事 を読み、前述の手順に従います。

  1. テーマでウィンドウコンテンツの遷移を有効にします。
  2. スタイルで共有要素の遷移を指定します。
  3. 遷移をXMLリソースとして定義します。
  4. Android:transitionName属性を使用して、両方のレイアウトの共有要素に共通の名前を割り当てます。
  5. ActivityOptions.makeSceneTransitionAnimation()メソッドを使用します。

ドキュメント によると、3番目のステップについて:

ChangeBoundsと組み合わせて、ChangeImageTransformを使用すると、サイズ、形状、またはImageView.ScaleTypeを変更するImageViewでコンテンツをスムーズにアニメーション化できます。

Res/transition/your_transition.xmlは次のようになります。

<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <changeBounds>
        <targets>
            <target Android:targetId="@id/ivA" />
            <target Android:targetId="@id/ivB" />
        </targets>
    </changeBounds>
    <changeImageTransform>
        <targets>
            <target Android:targetId="@id/ivA" />
            <target Android:targetId="@id/ivB" />
        </targets>
    </changeImageTransform>
</transitionSet>

または、ivAとivBのみをアニメーション化する必要がある場合は、単に次のようにします。

<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <changeBounds/>
    <changeImageTransform/>
</transitionSet>
30
Yi-Ping Shih

このガイド、他のいくつか、および参照資料に従って、これを機能させました。

このスタイルのトランジションセット。これを解像度/遷移の下に置きます:

<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <changeBounds>
        <targets>
            <target Android:targetId="@id/ivA" />
            <target Android:targetId="@id/ivB" />
        </targets>
    </changeBounds>
    <changeImageTransform>
        <targets>
            <target Android:targetId="@id/ivA" />
            <target Android:targetId="@id/ivB" />
        </targets>
    </changeImageTransform>
</transitionSet>

ソースおよびターゲットのImageViewsで、名前タグを追加する必要があります。名前は同じでなければなりません。

<ImageView
...
Android:transitionName="MYTRANSITIONVIEW"

/>

Styles.xmlで、アプリケーションテーマに追加します。

<item name="Android:windowContentTransitions">true</item>
<item name="Android:windowActivityTransitions">true</item>
<item name="Android:windowSharedElementEnterTransition">@transition/my_transition</item>
<item name="Android:windowSharedElementExitTransition">@transition/my_transition</item>

これをフラグメント内で実行しているので、次のような新しいアクティビティを開始します。

Bundle bundle = null;

if (activity != null) {
    ActivityOptionsCompat options =
                ActivityOptionsCompat.makeSceneTransitionAnimation(activity, Frag2_, "MYTRANSITIONVIEW");
    bundle = options.toBundle();
}
activity.startActivity(i, bundle);

API 21クライアントで動作します。 XMLタグが無効であるため、API 16クライアントでは機能しませんでした。

これがお役に立てば幸いです。

わずかな更新、終了時に逆の遷移を取得するには、私は呼び出す必要がありました

supportFinishAfterTransition();

finish();ではなく

8
formica