未执行活动转换 (Lollipop)
Posted
技术标签:
【中文标题】未执行活动转换 (Lollipop)【英文标题】:Activity transition not performed (Lollipop) 【发布时间】:2015-11-17 09:58:37 【问题描述】:我正在制作活动 X 和活动 Y 之间的过渡动画。 X 包含一个包含图片的列表,当点击图片时,在活动 Y 中会展开和“缩放”。
所以,这张图片是 X 和 Y 之间的共享元素。我在 XML 布局中设置了它的 transitionName
属性。
这是启动活动的代码Y:
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, clickedImage, clickedImage.getTransitionName());
startActivityForResult(intent, OPEN_PICTURE_REQUEST, options.toBundle());
到这里为止,一切正常。但是,我还想在输入时为活动 Y 的布局设置动画。 为此,我在 XML 文件 (picture_enter.xml) 中定义了过渡:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="together">
<transition
class="android.transition.Explode"
android:startDelay="200">
<targets>
<target android:targetId="@+id/top_toolbar_container" />
</targets>
</transition>
</transitionSet>
最后,在活动的onCreate
中Y我初始化了过渡:
TransitionInflater inflater = TransitionInflater.from(this);
Transition transition = inflater.inflateTransition(R.transition.picture_enter);
Window window = getWindow();
window.setEnterTransition(transition);
但这永远不会执行。只有图像的“缩放”效果才能正常工作。我也尝试过以编程方式定义过渡。 有什么建议吗?
【问题讨论】:
我怀疑<targets>
标签是这种奇怪行为的主要原因。如果您删除<targets>
标签,默认情况下过渡将应用于activity Y
。小建议:可以直接在transitionSet
里面定义explode,
slide
等转场,transition
标签主要用来定义自定义转场。
【参考方案1】:
您应该使用带有以下窗口标签的应用程序主题:
<style name="CustomActionBarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- enable overlapping of exiting and entering activities -->
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
</style>
在 Mainfest 文件中,在应用程序标签内使用 android:theme="@style/CustomActionBarTheme"
在活动 X 中,
ActivityOptionsCompat options = ActivityOptionsCompat
.makeSceneTransitionAnimation(activity,img_pic, "img_pic");
在 Activity X 和 Activity Y 的布局文件中,“img_pic”是 android:transitionName="img_pic"。
注意: android:transitionName 值应该相同才能进行转换。
使用 ActivityOptionsCompat 或 ActivityOptions 打开 Activity Y,
Intent intent = new Intent(context,Activity_Y.class);
startActivity(intent, options.toBundle());
【讨论】:
我已经尝试将这些值添加到 styles.xml 中,但仍然无法正常工作,谢谢 顺便说一句。 styles.xml 文件必须在 drawable-v21 文件夹下。以上是关于未执行活动转换 (Lollipop)的主要内容,如果未能解决你的问题,请参考以下文章
使用Material Design在Android Lollipop中的ListView中的活动过渡动画
无法从我的服务类(Android Lollipop)启动设备管理员活动
Android onChange 事件未在 contentObserver 中触发,用于 android 5 (Lollipop) 上的 chrome 历史记录