棒棒糖引入了一种在活动之间转换的新方式(链接here,here,here和here)。
他们在其中一个视频(here)上说,我可以准确选择每个视图的转换方式,但我找不到怎么做。我发现的唯一一件事是如何为所有视图设置它,除了“英雄”视图(您选择如何将其转换为新活动并返回)。
例如,让我们使用具有此屏幕的Google即时应用:
当你点击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>
如何选择每个视图在转换时将执行的操作,而不仅仅是说所有内容都具有相同的效果(“英雄”视图除外)?
例如,是否可以为除“英雄”视图之外的所有视图选择“爆炸”转换,以及具有不同转换(例如淡出/淡入)的视图?
请展示如何操作的示例。如果需要,您可以使用我上面编写的代码。
答案 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
对象可以用作窗口内容转换,它将同时并行播放两个幻灯片转换。