如何在Lollipop上自定义活动过渡,在某些视图上的工作方式不同?

时间:2014-12-31 13:48:21

标签: java android android-5.0-lollipop activity-transition

背景

棒棒糖引入了一种在活动之间转换的新方式(链接herehereherehere)。

问题

他们在其中一个视频(here)上说,我可以准确选择每个视图的转换方式,但我找不到怎么做。我发现的唯一一件事是如何为所有视图设置它,除了“英雄”视图(您选择如何将其转换为新活动并返回)。

例如,让我们使用具有此屏幕的Google即时应用: enter image description here

当你点击editText时,底部卡片具有“爆炸”效果,但是一切都变暗,而editText后面的imageView逐渐淡出。

editText可能是“英雄”视图,它在活动之间转换,因为它位于屏幕上的同一位置,这可能对用户没有任何视觉效果。

我尝试了什么

我试图模仿Google现在所做的事情,但正如我所写的那样,imageView也有“爆炸”效果,所以它在listView后面的底部,这是一个奇怪的效果(因为它动画时被裁剪)。我更喜欢它要么动画到不同的方向,要么淡出。

以下是我正在使用的转换的示例代码:

    final Intent intent = new Intent(activity, SearchActivity.class);
    ViewCompat.setTransitionName(viewToTransitionFromAndTo, VIEW_TO_TRANSITION_TO);
    final ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
            viewToTransitionFromAndTo, VIEW_TO_TRANSITION_TO);
    ActivityCompat.startActivityForResult(activity, intent, requestCode, options.toBundle());

在开始其他活动的活动主题中,我有:

<style name="AppTheme.transition" parent="@style/AppTheme">

    <!-- transition support -->
    <item name="android:windowContentTransitions" tools:targetApi="21">true</item>
    <item name="android:windowActivityTransitions" tools:targetApi="21">true</item>
    <item name="android:windowEnterTransition" tools:targetApi="21">@transition/explode</item>
    <item name="android:windowExitTransition" tools:targetApi="21">@transition/explode</item>
    <item name="android:windowSharedElementEnterTransition" tools:targetApi="21">@transition/move_image</item>
    <item name="android:windowSharedElementExitTransition" tools:targetApi="21">@transition/move_image</item>
    <item name="android:windowAllowReturnTransitionOverlap" tools:targetApi="21">true</item>
    <item name="android:windowAllowEnterTransitionOverlap" tools:targetApi="21">false</item>
</style>

并且转换文件是:

explode.xml

<?xml version="1.0" encoding="utf-8"?>
<explode />

move_image.xml

<?xml version="1.0" encoding="utf-8"?>
<transitionSet>

    <changeBounds />

    <changeImageTransform />

</transitionSet>

问题

如何选择每个视图在转换时将执行的操作,而不仅仅是说所有内容都具有相同的效果(“英雄”视图除外)?

例如,是否可以为除“英雄”视图之外的所有视图选择“爆炸”转换,以及具有不同转换(例如淡出/淡入)的视图?

请展示如何操作的示例。如果需要,您可以使用我上面编写的代码。

1 个答案:

答案 0 :(得分:1)

使用TransitionSet并使用Transition#addTarget()Transition#excludeTarget()添加/排除某些目标。例如,假设您有两个视图,并且您希望每个视图都以不同的方向从屏幕上滑落。您可以使用以下代码创建此类转换:

TransitionSet set = new TransitionSet();

Transition slideUp = new Slide(Gravity.UP);
slideUp.addTarget(view1);
set.addTransition(slideUp);

Transition slideDown = new Slide(Gravity.DOWN);
slideDown.addTarget(view2);
set.addTransition(slideDown);

TransitionSet extends Transition,因此生成的set对象可以用作窗口内容转换,它将同时并行播放两个幻灯片转换。