Lollipop中的Activity和Fragment转场效果

8
我在努力理解Lollipop中新的Activity Transition框架。Activity Transition很容易使用,有一些基础信息在这里,但是Fragment Transition没有文档,并且我无法让它工作。我尝试了这个用例(在Android中非常常见):

情况1:ActA + FragA -> ActB + FragB

共享元素是FragA和FragB中的一个图像。我没有成功的代码,所以我回退到了下面这个场景:

情况2:ActA + FragA -> ActB

在FragA和ActB上有一个sharedElement。动画不起作用,我只能看到当我在FragA上点击图像时,图像消失了,在动画持续时间后它在ActB中弹出。FragA之外但在ActA内的共享视图(例如Toolbar)正确地进行动画处理。
在这种情况下,sharedImage是RecyclerView中的imageView,可能是项布局xml中的android:transitionName="shared_icon"标记不起作用吗?
这是我的主题:
 <!-- Window Transactions -->
    <item name="android:windowContentTransitions">true</item>
    <item name="android:windowAllowEnterTransitionOverlap">true</item>
    <item name="android:windowAllowReturnTransitionOverlap">true</item>
    <item name="android:fragmentAllowEnterTransitionOverlap">@bool/true_bool</item>
    <item name="android:fragmentAllowReturnTransitionOverlap">@bool/true_bool</item>

    <item name="android:windowEnterTransition">@transition/window_transition.xml</item>
    <item name="android:windowExitTransition">@transition/window_transition.xml</item>
    <item name="android:fragmentEnterTransition">@transition/window_transition.xml</item>
    <item name="android:fragmentReturnTransition">@transition/window_transition.xml</item>
    <item name="android:fragmentReenterTransition">@transition/window_transition.xml</item>

    <!-- Shared Element Transactions -->
    <item name="android:windowSharedElementEnterTransition">@transition/shared_elements_transform.xml</item>
    <item name="android:windowSharedElementExitTransition">@transition/shared_elements_transform.xml</item>

    <item name="android:fragmentSharedElementEnterTransition">@transition/shared_elements_transform.xml</item>
    <item name="android:fragmentSharedElementReturnTransition">@transition/shared_elements_transform.xml</item>

window_transition.xml:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together"
android:duration="@integer/act_transition_duration">
<changeBounds  />
<changeTransform />
<changeClipBounds />
<changeImageTransform />
</transitionSet>

shared_element_transition.xml:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together"
android:duration="@integer/act_transition_duration">
<changeImageTransform />
<changeBounds />
</transitionSet>

我假设你已经尝试了这篇文章中提出的建议(因为你显然已经在评论中提到了它)?https://plus.sandbox.google.com/u/1/+AlexLockwood/posts/FJsp1N9XNLS - Alex Lockwood
此外,如果您正在为图像视图添加动画效果... 您是否有可能是在第一个活动中将低分辨率缩略图动画转换到第二个活动中的高分辨率图像? - Alex Lockwood
图片来自drawable(确切地说是由context.getPackageManager().getApplicationIcon(packageName)返回的应用程序图标)。该帖子提供了一个目标片段的解决方案(这将是情况1,我根本不知道如何做),而在情况2中,我有一个指向目标活动的源片段。即使只是一个简单的Activity,postponeEnterTransition()是否必要?我需要推迟到获取可绘制对象之后吗(imageView具有固定的宽度/高度)? - David Corsalini
1
我不能确定是否需要在查看您的Activity代码之前,但推迟转换是我尝试修复错误的第一件事。如果过渡开始得太早(例如,在提交和布局片段事务之前或在加载高分辨率图像视图之前等),那么很有可能转换将简单地无法执行动画(因为转换未能成功捕获所需的起始值)。另请参见此帖子:https://dev59.com/XYTba4cB1Zd3GeqP_tfb - Alex Lockwood
http://www.androiddesignpatterns.com/2014/12/activity-fragment-transitions-in-android-lollipop-part1.html - Adrian Monk
有没有人对问题的CASE 1有可行的解决方案? - anandbibek
1个回答

6

片段转换是用于在同一活动中的片段之间工作的。如果您有任何两个不同的活动,无论它们是否具有片段,都会使用活动转换。可以忽略所有片段转换属性。

在您的第二种情况下,如果设置正确,则不应该出现任何过渡问题。我猜测您的应用程序主题没有从android:Theme.Material派生,因此您需要一个更多的属性:

<item name="android:windowActivityTransitions">true</item>

windowContentTransitions允许您使用TransitionManager在setContentView之间平滑地进行动画。

当您的启动活动中有一个片段(如情况1)时,您可能需要像@AlexLockwood建议的那样:postponeEnterTransition。 然而,您也可以使用以下方法:

getFragmentManager().executePendingTransactions();

在你的onCreate()中,使用以下代码强制加载碎片,以便Activity Transition可以看到你布局中的所有视图。


使用getFragmentManager().executePendingTransactions();后,我的Act->fragB的内容显示为空白。 - Shridutt Kothari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接