使用带有ChangeImageTransform的共享元素过渡在两个活动之间为ImageView设置动画

iFo*_*sts 17 android android-5.0-lollipop activity-transition shared-element-transition

我试图将一个ImageView动画设置为Android API级别21中两个活动之间的另一个位置.由于Android L预览中的"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>
Run Code Online (Sandbox Code Playgroud)

有没有工作的例子?谢谢!

Yi-*_*hih 30

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

  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>
Run Code Online (Sandbox Code Playgroud)

或者只是喜欢这个,如果只需要动画ivA和ivB:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeBounds/>
    <changeImageTransform/>
</transitionSet>
Run Code Online (Sandbox Code Playgroud)


for*_*ica 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>
Run Code Online (Sandbox Code Playgroud)

在源和目标ImageView中,您需要添加名称标记.名称必须相同.

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

/>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

我在一个片段中运行它,所以我开始这样的新活动:

Bundle bundle = null;

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

它适用于API 21客户端.它不适用于API 16客户端,因为XML标记无效.

我希望这有帮助.

稍微更新,为了在退出时获得反向转换,我不得不打电话

supportFinishAfterTransition();
Run Code Online (Sandbox Code Playgroud)

而不是完成();