17

我正在尝试将一个 ImageView 动画到 Android API 级别 21 中的两个活动之间的另一个位置。由于 Android L Preview 中的“MoveImage”已被删除,我改用“ ChangeImageTransform ”,但文档中的示例代码不起作用(两个图像分别动画)。

<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>

有没有可行的例子?谢谢!

4

2 回答 2

30

要在具有共享元素的两个活动之间制作屏幕过渡动画,您可以阅读本文并按照上述步骤操作:

  1. 在您的主题中启用窗口内容转换。
  2. 在您的样式中指定共享元素过渡。
  3. 将您的转换定义为 XML 资源。
  4. 使用 android:transitionName 属性为两个布局中的共享元素分配一个通用名称。
  5. 使用 ActivityOptions.makeSceneTransitionAnimation() 方法。

关于第三步,根据文档

结合 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>
于 2014-10-28T03:10:08.870 回答
8

我已经按照本指南、其他一些指南和参考材料进行了这项工作。

以这种风格设置的过渡。我把它放在 res/transition 下:

<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 客户端。它不适用于 API 16 客户端,因为 XML 标记无效。

我希望这有帮助。

轻微更新,要在退出时获得反向转换,我不得不打电话

supportFinishAfterTransition();

而不是完成();

于 2015-10-15T15:18:00.843 回答