使用共享元素时活动转换中的小问题

7
我想使用Android Lollipop的新Activity转换效果,但是在动画过程中我看到了非常奇怪的抖动。我拼凑出了我能够想到的最简单的示例。
这是我简短版的操作:
1. 在我的styles.xml中启用窗口内容转换 2. 在我的样式中引用一个非常简单的slide.xml作为退出转换 3. 为两个布局中的共享元素提供android:transitionName 4. 使用该名称和我要共享的视图调用ActivityOptions.makeSceneTransitionAnimation() 5. 将生成的bundle传递给startActivity()
我看到的行为是(尝试将动画速度慢10倍以了解我的意思):
就在滑动动画滑下不共享的视图之前,那些不共享的视图会跳下一点。它们实际上会稍微分开一点。
但是:这只发生在我第二次运行该动画(以及每次之后)时。第一次通过看起来很好。而且只有在我想要与下一个活动共享一个元素时才会发生这种情况。如果我不尝试共享元素,一切都正常。
以下是我的代码:
values/styles.xml
<resources>
<style name="AppTheme" parent="android:Theme.Material.Light">
    <!-- enable window content transitions -->
    <item name="android:windowContentTransitions">true</item>

    <!-- specify exit transition -->
    <item name="android:windowExitTransition">@transition/slide</item>
</style>
</resources>

transition/slide.xml

<slide />

主要活动的布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#0000ff" />

        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#00ff00" />

        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#0000ff" />

        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#00ff00" />

    </LinearLayout>

    <!-- the actual element I want to share -->
    <View
        android:id="@+id/view"
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:background="#ff0000"
        android:elevation="8dp"
        android:transitionName="view" />

</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener {

    View mView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mView = findViewById(R.id.view);
        mView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mView, "view");

        Intent intent = new Intent(this, SecondaryActivity.class);
        startActivity(intent, options.toBundle());
    }


}

你使用的共享元素转换的代码在哪里?我看到你在样式中指定了 windowExitTransition,但是你如何设置 windowSharedElementExitTransition?还有,你的第二个活动布局代码是什么样子的? - Alex Lockwood
同样的行为是否会发生在您为第一个活动的布局XML中的每个视图设置layout_weight="1"之外,给非共享视图固定高度的情况下?此外,还有其他类似的行为吗? - Alex Lockwood
我们没有指定自定义的windowSharedElementExitTransition。因此,我们正在使用主题的默认转换。共享元素在两个布局中已经具有固定大小。 - Greeny
1个回答

11

可能是因为在L版本稳定之后,才发现了转换库中的一个bug。

该bug要求您具有重新输入转换和共享元素重新输入转换。默认的重新输入转换对于两者都是退出转换相同的。

如果在返回转换期间,共享元素在视图仍在输入时被传送回调用的Activity,则当它中断返回调用时,您将看到一个抽噎。使用滑动和爆炸转换时,您还会看到下一次退出时,它们将从抽噎发生的位置开始,因此您会得到一个不错的双打。

因此,在MR1之前,您有几个选项可以解决此问题:

  • 显式设置android:windowSharedElementReenterTransition@null。大多数情况下,您不需要共享元素重新进入转换,因为被调用的Activity会为您放置共享元素在正确的位置。
  • 不使用退出转换(将android:windowReenterTransition设置为@null
  • 确保调用Activity的android:windowSharedElementReturnTransition的持续时间足够长,以便调用Activity的windowReenterTransition首先完成。这可能很棘手,因为它可能取决于设备状态--调用Activity可能已从内存中删除并需要重新启动。
  • android:windowAllowReturnTransitionOverlap设置为false

1
你在 Google 做软件工程师吗?只是好奇因为听起来像是,但是 StackOverflow 上没有这么说。 :) - Adrian Monk
android:windowAllowReturnTransitionOverlap设置为false目前可以解决问题。但是我也在https://code.google.com/p/android/issues/detail?id=78393上报告了一个错误。 - Björn Hurling
是的,我应该更新那个配置文件。Bjorn,感谢您报告此错误。 - George Mount
2
@BjörnHurling 现在 MR1 已经发布了,我很好奇您在运行 v5.1 棒棒糖设备上的转换时是否仍然遇到相同的问题。请告诉我。 - Alex Lockwood

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