未执行活动转换 (Lollipop)

Posted

技术标签:

【中文标题】未执行活动转换 (Lollipop)【英文标题】:Activity transition not performed (Lollipop) 【发布时间】:2015-11-17 09:58:37 【问题描述】:

我正在制作活动 X 和活动 Y 之间的过渡动​​画。 X 包含一个包含图片的列表,当点击图片时,在活动 Y 中会展开和“缩放”。 所以,这张图片是 XY 之间的共享元素。我在 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>

最后,在活动的onCreateY我初始化了过渡:

TransitionInflater inflater = TransitionInflater.from(this);
Transition transition = inflater.inflateTransition(R.transition.picture_enter);
Window window = getWindow();
window.setEnterTransition(transition);

但这永远不会执行。只有图像的“缩放”效果才能正常工作。我也尝试过以编程方式定义过渡。 有什么建议吗?

【问题讨论】:

我怀疑&lt;targets&gt; 标签是这种奇怪行为的主要原因。如果您删除&lt;targets&gt; 标签,默认情况下过渡将应用于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中的活动过渡动画

Lollipop:获取热门活动名称

无法从我的服务类(Android Lollipop)启动设备管理员活动

Android 推送通知服务未在 Lollipop 上启动

Lollipop 设备的共享元素转换崩溃

Android onChange 事件未在 contentObserver 中触发,用于 android 5 (Lollipop) 上的 chrome 历史记录