【问题标题】:Hiccups in activity transitions with shared elements共享元素的活动转换中的打嗝
【发布时间】:2014-10-25 22:16:42
【问题描述】:

我想使用 Android Lollipop 的新 Activity Transitions。但目前我在动画中看到了非常奇怪的打嗝。我拼凑了我能想到的最小样本。

这是我在一个非常短的版本中所做的:

  1. 在我的styles.xml 中启用了窗口内容转换
  2. 引用了一个非常简单的 slide.xml 作为我风格的退出过渡
  3. 为两种布局中的共享元素提供了 android:transitionName
  4. ActivityOptions.makeSceneTransitionAnimation() 用那个名字和我想分享的观点
  5. 将生成的包传递给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?另外,您的第二个活动布局代码是什么样的?
  • 另外,如果你给你的非共享视图固定高度(而不是为你的第一个活动的布局 XML 中的每个视图设置layout_weight="1"),是否会发生同样的行为?
  • 我们不指定自定义windowSharedElementExitTransition。因此,我们使用默认主题。共享元素在两种布局中都具有固定大小。

标签: android android-5.0-lollipop shared-element-transition activity-transition


【解决方案1】:

您可能在转换库中遇到了一个错误,由于某种原因,直到 L 被锁定后才被发现。

在bug中,你必须有一个重入过渡和一个共享元素重入过渡。默认的重新进入过渡与两者的退出过渡相同。

如果在返回转换期间,共享元素在视图仍在进入时被转移回调用 Activity,则当它中断返回调用时,您将看到一个打嗝。通过滑动和爆炸过渡,您还会看到下次退出时,它们将从打嗝发生的地方开始,因此您会得到一个不错的双重效果。

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

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

【讨论】:

  • 您是 Google 的软件工程师吗?只是想知道,因为它听起来像,但在您的 StackOverflow 配置文件中并没有这样说。 :)
  • 现在将android:windowAllowReturnTransitionOverlap 设置为false 有效。但我还在code.google.com/p/android/issues/detail?id=78393 提交了一份错误报告
  • 是的,我应该更新那个配置文件。 Bjorn,感谢提交错误。
  • @BjörnHurling 现在 MR1 已经发布,我很好奇您在 v5.1 Lollipop 设备上运行转换时是否仍然遇到同样的问题。告诉我。
猜你喜欢
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多