【问题标题】:Animate ImageView between two activities using shared element transitions with ChangeImageTransform使用带有 ChangeImageTransform 的共享元素转换在两个活动之间为 ImageView 设置动画
【发布时间】:2014-10-28 03:02:54
【问题描述】:

我正在尝试将一个 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>

有什么可行的例子吗?谢谢!

【问题讨论】:

    标签: android android-5.0-lollipop shared-element-transition activity-transition


    【解决方案1】:

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

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

    关于第3步,根据documentation

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

    【讨论】:

    • 我一直试图让它工作,但是新活动的输入转换淡入淡出,ImageView 是旧活动中显示的最后一件事。退出过渡虽然有效。
    • @TimmahhTimmahh 您是否按照文档中的所有步骤进行操作?请提供更多信息,谢谢:)
    • 我发现了发生了什么。我正在将视图添加到 ListView 标题中,因此直到转换之后才能找到它。解决方案是推迟过渡,然后在 ListView 的 OnPreDrawListener 中启动它。
    • 嗨,我尝试在我的应用程序中使用它,但是当我单击列表中的一个项目时,列表的图像会转到另一个应用程序(那会变得更大)但它仍然是大小相同。如果按下后退按钮,图像会调整到正确的大小并返回到列表中。
    • @Radu,为什么有人不能弄清楚?
    【解决方案2】:

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

    以这种风格设置的过渡。我把它放在 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和目标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();
    

    而不是finish();

    【讨论】:

    • 不应该是 res/transitions,应该是 res/transition :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多